Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 13027|Jawab: 0

StackOverflow sangat besar, apa arsitekturnya?

[Salin tautan]
Diposting pada 11/04/2018 17.33.18 | | | |
Untuk memudahkan memahami tentang artikel ini, mari kita mulai dengan perubahan statistik harian rata-rata Stack Overflow. Angka-angka berikut berasal dari statistik per 12 November 2013:

  • Penyeimbang beban menerima 148.084.833 permintaan HTTP
  • Dari jumlah tersebut, 36.095.312 adalah pemuatan halaman
  • 833.992.982.627 byte (776 GB) lalu lintas HTTP digunakan untuk mengirim
  • Sebanyak 286.574.644.032 byte (267 GB) data diterima
  • Sebanyak 1.125.992.557.312 byte (1.048 GB) data dikirim
  • 334.572.103 kueri SQL (termasuk hanya dari permintaan HTTP)
  • 412.865.051 permintaan Redis
  • 3.603.418 permintaan Tag Engine
  • Dibutuhkan 558.224.585 ms (155 jam) untuk kueri SQL
  • Dibutuhkan 99.346.916 ms (27 jam) untuk permintaan Redis
  • Menghabiskan 132.384.059 ms (36 jam) untuk permintaan mesin tag
  • Dibutuhkan 2.728.177.045 ms (757 jam) untuk pemrosesan proses ASP.Net



Data berikut menunjukkan perubahan statistik per 9 Februari 2016, sehingga Anda dapat membandingkan:

  • Permintaan HTTP yang diterima oleh penyeimbang beban: 209.420.973 (+61.336.090)
  • 66.294.789 (+30.199.477) di mana halaman dimuat
  • Data HTTP terkirim: 1.240.266.346.053 (+406.273.363.426) byte (1,24 TB)
  • Jumlah total data yang diterima: 569.449.470.023 (+282.874.825.991) byte (569 GB)
  • Jumlah total data yang dikirim: 3.084.303.599.266 (+1.958.311.041.954) byte (3,08 TB)
  • Kueri SQL (hanya dari permintaan HTTP): 504.816.843 (+170.244.740)
  • Kutub Cache Redis: 5.831.683.114 (+5.418.818.063)
  • Pencarian Elastis: 17.158.874 (tidak dilacak pada tahun 2013)
  • Permintaan Mesin Tag: 3,661,134 (+57,716)
  • Waktu kumulatif yang digunakan untuk menjalankan kueri SQL: 607.073.066 (+48.848.481) ms (168 jam)
  • Waktu hit cache Redis yang dikonsumsi: 10.396.073 (-88.950.843) ms (2,8 jam)
  • Waktu yang Dikonsumsi oleh Permintaan Tag Engine: 147.018.571 (+14.634.512) ms (40,8 jam)
  • Waktu yang Dikonsumsi dalam Pemrosesan ASP.Net: 1.609.944.301 (-1.118.232.744) ms (447 jam)
  • 22,71 (-5,29) ms 49.180.275 halaman terbitan waktu render rata-rata (di mana 19,12 ms dikonsumsi dalam ASP.Net)
  • 11,80 (-53,2) ms 6.370.076 waktu render rata-rata halaman pertama (di mana 8,81 ms dikonsumsi dalam ASP.Net)



Anda mungkin bertanya-tanya mengapa ASP.Net memproses 61 juta permintaan lebih banyak per hari tetapi mengurangi waktu pemrosesan hingga 757 jam (dibandingkan dengan 2013). Hal ini terutama disebabkan oleh peningkatan yang kami lakukan pada server kami pada awal 2015, serta banyak pekerjaan pengoptimalan kinerja dalam aplikasi. Jangan lupa: kinerja masih menjadi nilai jual. Jika Anda lebih ingin tahu tentang detail perangkat keras tertentu, jangan khawatir, saya akan memberikan detail perangkat keras spesifik dari server yang digunakan untuk menjalankan situs-situs ini dalam bentuk lampiran di artikel berikutnya (saya akan memperbarui tautan ini ketika saatnya tiba).

Jadi apa yang telah berubah dalam dua tahun terakhir? Tidak banyak, hanya mengganti beberapa server dan peralatan jaringan. Berikut adalah ikhtisar server yang digunakan untuk menjalankan situs web Anda saat ini (perhatikan bagaimana mereka berubah sejak 2013)

  • 4 server Microsoft SQL Server (2 di antaranya menggunakan perangkat keras baru)
  • 11 Server Web IIS (Perangkat Keras Baru)
  • 2 Server Redis (perangkat keras baru)
  • 3 server Tag Engine (2 di antaranya menggunakan perangkat keras baru)
  • 3 Server Elasticsearch (sama seperti di atas)
  • 4 server penyeimbangan beban HAProxy (2 ditambahkan untuk mendukung CloudFlare)
  • 2 perangkat jaringan (inti Nexus 5596 + 2232TM Fabric Extender, semua perangkat ditingkatkan ke bandwidth 10Gbps)
  • 2 x Firewall Fortinet 800C (menggantikan Cisco 5525-X ASA)
  • 2 router Cisco ASR-1001 (menggantikan router Cisco 3945)
  • 2 Router Cisco ASR-1001-x (BARU!) )



Apa yang kita butuhkan untuk membuat Stack Overflow berfungsi? Tidak banyak yang berubah sejak 2013, tetapi berkat pengoptimalan dan perangkat keras baru yang disebutkan di atas, kami sekarang hanya membutuhkan satu server web. Kami telah menguji situasi ini secara tidak sengaja, dengan keberhasilan beberapa kali. Harap dicatat: Saya hanya mengatakan itu berhasil, saya tidak mengatakan itu ide yang bagus. Tapi setiap kali ini terjadi, itu cukup menarik.

Sekarang setelah kita memiliki beberapa angka dasar tentang ide penskalaan server, mari kita lihat bagaimana kita membuat halaman web keren ini. Beberapa sistem ada sepenuhnya secara independen (dan kami tidak terkecuali), dan tanpa pandangan holistik yang mengintegrasikan bagian-bagian ini, makna perencanaan arsitektur sangat berkurang. Tujuan kami adalah untuk memahami situasi secara keseluruhan. Akan ada banyak artikel yang masuk jauh ke dalam setiap bidang tertentu di masa mendatang. Artikel ini hanyalah ringkasan struktur logis perangkat keras utama, dan artikel berikutnya akan berisi detail spesifik tentang perangkat keras ini.

Jika Anda ingin melihat seperti apa perangkat keras ini hari ini, berikut adalah beberapa foto yang saya ambil dari Kabinet A (Kabinet B persis sama dengannya) ketika saya meningkatkan server pada Februari 2015:



Sekarang, mari selami tata letak arsitektur. Berikut ini adalah ringkasan arsitektur logis dari sistem utama yang ada:



Prinsip dasar

Berikut adalah beberapa prinsip umum yang tidak perlu diperkenalkan secara bergantian:

  • Semuanya memiliki cadangan yang berlebihan.
  • Semua server dan perangkat jaringan memiliki setidaknya dua koneksi bandwidth 10Gbps.
  • Semua server memiliki dua sumber daya yang menyediakan daya melalui dua unit set UPS, dua generator di belakangnya, dan dua umpan balik tegangan jaringan.
  • Semua server memiliki cadangan redundan yang terletak di Rak A dan Rak B.
  • Semua server dan layanan memiliki cadangan redundan ganda di pusat data terpisah (di Colorado), meskipun saya terutama meliput New York.
  • Semuanya memiliki cadangan yang berlebihan.


Internet

Pertama, Anda perlu menemukan situs web kami, yang merupakan hal DNS. Menemukan situs web itu cepat, jadi sekarang kami memberikannya ke CloudFlare karena mereka memiliki server DNS di setiap sudut dunia. Kami memperbarui data DNS melalui API, dan mereka bertanggung jawab untuk "mengelola" DNS. Namun, dalam pikiran jahat kami, kami masih memiliki server DNS kami sendiri karena masalah kepercayaan yang mengakar. Ketika kiamat bersifat apokaliptik – mungkin karena masalah GPL, Punyon, atau caching – dan orang masih ingin memprogram untuk mengalihkan perhatian mereka, kami beralih ke server DNS kami sendiri.

Setelah browser Anda menemukan tempat persembunyian kami, lalu lintas HTTP dari empat ISP kami (Level 3, Zayo, Cogent, dan Lightower di New York) memasuki salah satu dari empat router canggih kami. Kami menggunakan Border Gateway Protocol (BGP, protokol yang sangat standar) untuk lalu lintas peer-to-peer dari penyedia jaringan untuk mengontrolnya dan menyediakan cara paling efisien untuk mengakses layanan kami. Router ASR-1001 dan ASR-1001-X dibagi menjadi dua kelompok, yang masing-masing harus menggunakan mode aktif/aktif untuk menangani lalu lintas dari kedua penyedia jaringan – di sini ada cadangan yang berlebihan. Meskipun semuanya memiliki bandwidth fisik yang sama yaitu 10Gbps, lalu lintas dari luar masih independen dari lalu lintas dari VLAN eksternal dan terhubung ke penyeimbangan beban secara terpisah. Setelah lalu lintas melewati router, Anda akan sampai ke penyeimbang beban.

Saya pikir mungkin sudah waktunya untuk menyebutkan bahwa kami memiliki MPLS dengan bandwidth 10Gbps antara kedua pusat data, meskipun ini tidak benar-benar terkait langsung dengan layanan situs web. Kami menggunakan teknologi ini untuk melakukan replikasi di luar lokasi dan pemulihan data yang cepat untuk menangani keadaan darurat tertentu. "Tapi Nick, tidak ada redundansi dalam hal ini!" Nah, dari sudut pandang teknis Anda benar (dalam arti positif), itu benar-benar satu titik kegagalan pada tingkat ini. Tapi tunggu! Melalui penyedia jaringan, kami juga memiliki dua rute failover OSPF tambahan (MPLS adalah pilihan pertama, dan ini adalah pilihan kedua dan ketiga karena alasan biaya). Setiap set perangkat yang disebutkan sebelumnya akan terhubung ke pusat data Colorado sesuai untuk menyeimbangkan beban lalu lintas jaringan jika terjadi failover. Tentu saja, kita bisa saja menghubungkan kedua set perangkat ini satu sama lain, sehingga ada empat set jalur, tetapi lupakan saja, mari kita lanjutkan.

Penyeimbangan Beban (HAProxy)

Penyeimbangan beban diimplementasikan dengan HAProxy 1.5.15, berjalan di CentOS 7 (versi Linux favorit kami). Dan tambahkan protokol transmisi aman TLS (SSL) di HAProxy. Kami juga mengawasi HAProxy 1.7, yang akan segera memberikan dukungan untuk protokol HTTP/2.

Tidak seperti server lain dengan koneksi jaringan LACP ganda 10Gbps, setiap penyeimbang beban memiliki dua koneksi 10Gbps: satu untuk jaringan eksternal dan yang lainnya untuk DMZ. Server ini memiliki memori 64GB atau lebih untuk menangani lapisan protokol SSL dengan lebih efisien. Ketika kita dapat menyimpan cache dan menggunakan kembali lebih banyak sesi TLS dalam memori, kita menggunakan lebih sedikit sumber daya komputasi saat menyambungkan ke klien yang sama. Ini berarti kami dapat memulihkan sesi dengan cara yang lebih cepat dan lebih murah. Memori sangat murah sehingga merupakan pilihan yang mudah.

Penyeimbangan beban itu sendiri mudah diatur. Kami mendengarkan situs web yang berbeda di beberapa IP yang berbeda (terutama untuk alasan manajemen sertifikat dan DNS) dan kemudian merutekan lalu lintas ke backend yang berbeda (terutama berdasarkan header host). Satu-satunya hal yang kita lakukan di sini adalah membatasi kecepatan dan mengikis beberapa informasi header (dari lapisan web) untuk masuk ke pesan log sistem HAProxy, dengan cara ini kita dapat merekam metrik kinerja untuk setiap permintaan. Kami akan menyebutkan ini secara rinci nanti.

Lapisan web (IIS 8.5, ASP.Net MVC 5.2.3, dan .Net 4.6.1)

Penyeimbangan beban mendistribusikan lalu lintas antara 9 dari apa yang kami sebut server web utama (01-09) dan 2 server web pengembangan (10-11, lingkungan pengujian kami). Server utama menjalankan Stack Overflow, Careers, dan semua situs Stack Exchange, sementara meta.stackoverflow.com dan meta.stackexchange.com berjalan di dua server lainnya. Aplikasi Tanya Jawab utama itu sendiri adalah multi-penyewa, yang berarti bahwa satu aplikasi menangani semua permintaan dari situs Tanya Jawab. Dengan kata lain, kita dapat menjalankan seluruh aplikasi Tanya Jawab pada satu kumpulan aplikasi di satu server. Aplikasi lain seperti Karir, API v2, API Seluler, dll., bersifat independen. Inilah yang Anda lihat di IIS untuk server master dan dev:



Berikut adalah distribusi tingkat web Stack Overflow seperti yang terlihat di Opserver (dasbor pemantauan internal kami):



Dan inilah konsumsi sumber daya dari server web ini:



Saya akan membahas lebih detail di artikel berikutnya tentang mengapa kami menyediakan begitu banyak sumber daya, dengan fokus pada rolling build, kelonggaran, dan redundansi.

Lapisan layanan (IIS, ASP.Net MVC 5.2.3, . NET 4.6.1 dan HTTP. SISTEM)

Di sebelah lapisan web adalah lapisan layanan. Mereka juga berjalan di atas IIS 2012 di Windows 8.5R2. Lapisan ini menjalankan beberapa layanan internal yang mendukung lapisan web dan sistem internal lainnya dari lingkungan produksi. Dua layanan utama adalah: "Stack Server", yang menjalankan mesin tag dan didasarkan pada http.sys (bukan IIS); API Providence (berdasarkan IIS). Fakta menarik: Saya harus menghubungkan kedua proses untuk terhubung ke soket yang berbeda, karena Stack Server akan mengakses cache L2 dan L3 dengan sangat sering saat menyegarkan daftar masalah pada interval dua menit.

Mesin yang menjalankan layanan ini sangat penting untuk mesin tag dan API backend, sehingga harus berlebihan, tetapi tidak 9x redundan. Misalnya, kami memuat semua artikel dan tagnya dari database setiap n menit (saat ini 2 menit), yang tidak rendah. Kami tidak ingin mengulangi operasi pemuatan ini 9 kali di lapisan web, 3 kali cukup aman bagi kami. Kami juga menggunakan konfigurasi perangkat keras yang berbeda untuk server ini untuk mengoptimalkan karakteristik komputasi dan pemuatan data dari mesin tag dan pekerjaan indeks elastis (juga berjalan di lapisan ini). "Mesin tag" itu sendiri adalah topik yang relatif kompleks yang akan dibahas dalam artikel khusus. Prinsip dasarnya adalah ketika Anda mengakses alamat /questions/tagged/java, Anda mengunjungi mesin penandaan untuk mendapatkan pertanyaan yang cocok. Mesin menangani semua pencocokan tag kecuali /search, jadi di mana saja termasuk navigasi baru mendapatkan data melalui layanan ini.

Caching & Penerbitan/Berlangganan (Redis)

Kami menggunakan Redis di beberapa tempat, dan memiliki stabilitas yang kokoh. Meskipun ada sebanyak 160 miliar operasi per bulan, CPU per instans tidak melebihi 2%, yang biasanya lebih rendah:



Kami menggunakan Redis untuk sistem caching tingkat L1/L2. Level "L1" adalah cache HTTP yang berfungsi di server web atau aplikasi serupa. Level "L2" adalah untuk mendapatkan data melalui Redis setelah cache level sebelumnya gagal. Data kami disimpan dalam format Protobuf, diimplementasikan melalui protobuf-dot-net yang ditulis oleh Marc Gravel. Untuk klien Redis, kami menggunakan pustaka StackExchange.Redis, yang merupakan perpustakaan sumber terbuka yang dikembangkan sendiri. Jika server web tidak masuk di cache L1 dan L2, server web mengambil data dari sumber datanya (kueri database, panggilan API, dan sebagainya) dan menyimpan hasilnya ke cache lokal dan Redis. Server berikutnya mungkin hilang dari cache L1 saat mengambil data yang sama, tetapi akan mengambil data di L2/Redis, menghilangkan kebutuhan akan kueri database atau panggilan API.

Kami juga menjalankan banyak situs Tanya Jawab, masing-masing dengan kunci L1/L2 cache L1/L2 sendiri sebagai awalan dalam cache L1 dan ID database di cache L2/Redis. Kami akan mempelajari topik ini di artikel mendatang.

Selain dua server Redis utama (satu master dan satu slave) yang menjalankan semua instance situs, kami juga menyiapkan instance untuk machine learning (terutama untuk alasan memori) menggunakan dua server slave khusus lainnya. Grup server ini digunakan untuk menyediakan layanan seperti merekomendasikan pertanyaan di beranda dan membuat pencocokan pekerjaan yang lebih baik. Platform ini disebut Providence, dan Kevin Montrose menulis tentangnya.

Server utama Redis memiliki RAM 256GB (sekitar 90GB digunakan), dan server Providence memiliki memori 384GB (sekitar 125GB digunakan).

Redis tidak hanya untuk caching, tetapi juga memiliki mekanisme penerbitan dan berlangganan di mana satu server dapat menerbitkan pesan dan pelanggan lain dapat menerima pesan (termasuk Redis dari klien hilir di server). Kami menggunakan mekanisme ini untuk menghapus cache L1 di layanan lain untuk menjaga konsistensi cache di server web. Tetapi ia memiliki kegunaan penting lainnya: soket web.

Soket web (NetGain)

Kami menggunakan websocket untuk mendorong pembaruan real-time kepada pengguna, seperti pemberitahuan di bilah atas, pemungutan suara, navigasi baru, jawaban baru, komentar, dan banyak lagi.

Server soket itu sendiri berjalan di lapisan web, menggunakan soket asli. Ini adalah aplikasi yang sangat kecil berdasarkan implementasi perpustakaan sumber terbuka kami: StackExchange.NetGain. Pada waktu puncak, kami memiliki sekitar 500.000 koneksi websocket bersamaan, yang merupakan banyak browser. Fakta menyenangkan: beberapa browser ini telah dibuka selama lebih dari 18 bulan, dan Anda harus menemukan seseorang untuk melihat apakah pengembang tersebut masih hidup. Bagan berikut menunjukkan pola konkurensi websocket minggu ini:



Mengapa menggunakan websocket? Pada skala kami, itu jauh lebih efisien daripada jajak pendapat. Dengan cara ini, kita dapat dengan mudah mendorong lebih banyak data dengan sumber daya yang lebih sedikit dan menjadi lebih real-time bagi pengguna. Pendekatan ini bukannya tanpa masalah: port sementara, pegangan file yang habis pada penyeimbang beban, adalah masalah yang sangat menarik, dan kita akan membicarakannya nanti.

Pencarian (Elasticsearch)

Spoiler: Tidak banyak yang perlu disukai di sini. Lapisan web menggunakan Elasticsearch 1.4 dan mengimplementasikan klien StackExchange.Elastic yang sangat ringan dan berkinerja tinggi. Tidak seperti kebanyakan hal, kami tidak berencana untuk membuka sumber bagian ini, hanya karena mengekspos subset API yang sangat kecil yang perlu kami gunakan. Saya yakin bahwa mempublikasikannya lebih besar daripada kerugian dan hanya akan membingungkan pengembang. Kami menggunakan elastic:/search di tempat-tempat ini untuk menghitung pertanyaan terkait dan memberikan saran saat mengajukan pertanyaan.

Setiap klaster Elastic (satu untuk setiap pusat data) berisi 3 node, masing-masing dengan indeksnya sendiri. Situs Karier juga memiliki beberapa indeks tambahan. Bagian yang sedikit kurang standar dari konfigurasi kami dalam lingkaran elastis adalah bahwa cluster 3 server kami sedikit lebih kuat daripada konfigurasi biasa: setiap server menggunakan penyimpanan SSD, memori 192GB, jaringan ganda bandwidth 10Gbps.

Domain aplikasi yang sama dari Stack Server (ya, kami dilemparkan oleh .Net Core di tempat ini) juga menghosting mesin tag, yang juga menggunakan Elasticsearch untuk pengindeksan berkelanjutan. Di sini kita menggunakan sedikit trik, seperti menggunakan ROWVERSION di SQL Server (sumber data) untuk membandingkan dengan dokumen "tempat terakhir" di Elastic. Karena tampaknya berurutan, mudah bagi kita untuk merayapi dan mengindeks konten jika dimodifikasi setelah kunjungan terakhir.

Alasan utama kami menggunakan Elasticsearch alih-alih teknologi seperti pencarian teks lengkap SQL adalah skalabilitas dan efektivitas biayanya. SQL relatif mahal untuk CPU, sedangkan Elastic jauh lebih murah dan memiliki banyak fitur baru akhir-akhir ini. Mengapa tidak menggunakan Solr? Kita perlu mencari di seluruh jaringan (dengan beberapa indeks secara bersamaan), dan Solr tidak mendukung skenario ini pada saat keputusan kita. Alasan kami belum menggunakan 2.x adalah karena jenisnya telah banyak berubah di 2.x, yang berarti kami harus mengindeks ulang semuanya jika kami ingin meningkatkan. Saya hanya tidak punya cukup waktu untuk merencanakan perubahan persyaratan dan migrasi.

Database (SQL Server)

Kami menggunakan SQL Server sebagai sumber kebenaran tunggal. Semua data di Elastic dan Redis berasal dari SQL Server. Kami memiliki dua kluster SQL Server dan dikonfigurasi dengan grup ketersediaan AlwaysOn. Setiap klaster memiliki server utama di New York (yang mengambil hampir semua beban) dan server replika, selain server replika di Colorado (pusat data pemulihan bencana kami). Semua operasi penyalinan bersifat asinkron.

Klaster pertama adalah satu set server Dell R720xd, masing-masing dengan memori 384GB, SSD PCIe dengan ruang 4TB, dan dua CPU 12-core. Ini termasuk Stack Overflow, Sites (itu nama yang buruk, saya akan menjelaskannya nanti), PRIZM, dan database Mobile.

Kluster kedua adalah satu set server Dell R730xd, masing-masing dengan memori 768GB, SSD PCIe dengan ruang 6TB, dan dua CPU 8-core. Kluster ini berisi semua database lainnya, termasuk Karier, ID Terbuka, Obrolan, log pengecualian, dan situs Tanya Jawab lainnya (misalnya, Pengguna Super, Kesalahan Server, dll.).

Di lapisan database, kami ingin menjaga pemanfaatan CPU pada tingkat yang sangat rendah, meskipun dalam praktiknya penggunaan CPU akan sedikit lebih tinggi ketika beberapa masalah caching yang direncanakan terjadi (yang sedang kami pecahkan masalah). Saat ini, NY-SQL02 dan 04 adalah server utama dan 01 dan 03 adalah server replika, dan kami baru saja me-rebootnya hari ini karena peningkatan SSD. Berikut adalah kinerja mereka dalam 24 jam terakhir:



Penggunaan SQL kami sangat sederhana. Sederhana berarti cepat. Sementara beberapa pernyataan kueri dapat diselewengkan, interaksi kita dengan SQL itu sendiri dilakukan dengan cara yang cukup asli. Kami memiliki beberapa Linq2SQL lama, tetapi semua pengembangan baru kami menggunakan Dapper, kerangka kerja micro-ORM sumber terbuka kami yang menggunakan POCO. Izinkan saya menjelaskannya dengan cara lain: Stack Overflow hanya memiliki satu prosedur tersimpan di database-nya, dan saya akan mematikan prosedur tersimpan terakhir yang tersisa ini dan menggantinya dengan kode.

Perpustakaan

Nah, mari kita ubah pikiran, berikut adalah hal-hal yang dapat membantu Anda lebih langsung. Saya telah menyebutkan beberapa di antaranya sebelumnya, tetapi saya akan memberi Anda daftar banyak perpustakaan .Net sumber terbuka yang kami pertahankan dan yang digunakan semua orang. Kami membuka sumber karena mereka tidak memiliki nilai bisnis inti yang terlibat, tetapi mereka dapat membantu pengembang di seluruh dunia. Saya harap Anda dapat menggunakannya sekarang:

  • Dapper (.Net Core) – Kerangka kerja mikro-ORM berkinerja tinggi untuk ADO.Net
  • StackExchange.Redis – Klien Redis berkinerja tinggi
  • MiniProfiler – profiler ringan yang kami gunakan di setiap halaman (juga mendukung Ruby, Go, dan Node)
  • Luar biasa – Untuk kesalahan pencatatan di SQL, JSON, MySQL, dll
  • Jil – Serialisasi dan deserialisasi JSON berkinerja tinggi
  • Sigil – .Net CIL Generation Helper (digunakan saat C# tidak cukup cepat)
  • NetGain – Server websocket berkinerja tinggi
  • Opserver – Dasbor pemantauan yang melakukan polling di sebagian besar sistem secara langsung dan dapat mengambil informasi dari Orion, Bosun, atau WMI
  • Bosun – Sistem pemantauan di latar belakang, ditulis dalam Go






Mantan:Enum memeriksa apakah nilai disertakan dalam enum
Depan:Bagaimana saya bisa menemukan MB dengan cepat
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com