it-swarm-id.com

Melayani tugas latar belakang di situs besar

Kami sedang menghadapi masalah yang menarik di StackOverflow.

Kami punya banyak tugas "yang perlu segera dikerjakan". Contohnya adalah memperbarui daftar "Pertanyaan Terkait". Apa yang telah kami lakukan di masa lalu adalah untuk membuntuti tugas-tugas tersebut ke pemuatan halaman beberapa pengguna.

Ini tidak pernah ideal, tetapi itu tidak terlalu terlihat. Sekarang SO telah melewati tanda tanya 1.000.000, para pengguna yang kurang beruntung mulai merasakannya.

Solusi alami adalah mendorong tugas-tugas ini ke latar belakang. Ada dua cara luas untuk melakukan ini, saya sedang mempertimbangkan.

1. Dalam IIS sebagai Thread-Pool/Work-Queue khusus

Pada dasarnya, kami memutar beberapa utas (non - ThreadPool , agar tidak mengganggu IIS) dan meminta mereka melayani beberapa koleksi yang kami dorong Funcs ke dalam.

Pro besar di sini adalah kesederhanaan. Kami tidak perlu khawatir tentang mengatur apa pun, kami juga tidak harus memastikan beberapa layanan eksternal siap dan merespons.

Kami juga mendapatkan akses ke semua kode umum kami.

Kontra adalah, yah, bahwa kita seharusnya tidak menggunakan utas latar belakang. Keberatan yang saya tahu semuanya berpusat di sekitar kelaparan IIS (jika Anda menggunakan ThreadPool) dan utas mati secara acak (karena daur ulang AppPool).

Kami memiliki infrastruktur yang ada untuk membuat kematian utas acak menjadi non-masalah (kemungkinan untuk mendeteksi tugas telah ditinggalkan, pada dasarnya), dan membatasi jumlah utas (dan menggunakan utas non-ThreadPool) juga tidak sulit.

Apakah saya melewatkan keberatan lain dalam IIS proses thread-pooling/work-queue?

Dipindahkan ke StackOverflow , karena tidak benar-benar dibahas di sini.

2. Sebagai Layanan

Entah solusi pihak ketiga, atau solusi kustom.

Pada dasarnya, kami akan menjalankan tugas melintasi batas proses untuk beberapa layanan dan lupakan saja. Agaknya kita menautkan beberapa kode, atau terbatas pada SQL + string koneksi mentah.

Pro adalah "cara yang tepat" untuk melakukan ini.

Kontra adalah bahwa kita sangat dibatasi dalam apa yang dapat kita lakukan, atau kita harus mengerjakan beberapa sistem untuk menjaga layanan ini sinkron dengan basis kode kita. Kita juga perlu menghubungkan semua pemantauan dan kesalahan saat masuk, yang kita dapatkan secara gratis dengan opsi "In IIS".

Apakah ada manfaat atau masalah lain dengan pendekatan layanan?

Singkatnya, apakah ada masalah yang tak terduga dan tidak dapat diatasi yang membuat pendekatan # 1 tidak bisa diterapkan dan jika demikian, apakah ada layanan pihak ketiga yang baik yang harus kita perhatikan untuk pendekatan # 2?

49
Kevin Montrose

Beberapa minggu yang lalu saya bertanya pertanyaan serupa pada SO. Singkatnya Shell, pendekatan saya untuk beberapa waktu sekarang adalah mengembangkan Layanan Windows. Saya akan menggunakan NServiceBus (dasarnya MSMQ di bawah penutup) untuk menyusun permintaan dari aplikasi web saya ke layanan saya. Saya dulu menggunakan WCF tetapi mendapatkan transaksi terdistribusi untuk bekerja dengan benar melalui WCF selalu tampak seperti menyebalkan. NServiceBus melakukan trik, saya bisa mengkomit data dan membuat tugas dalam transaksi dan tidak khawatir apakah layanan saya sudah berjalan dan berjalan pada saat itu. Sebagai contoh sederhana, jika saya perlu mengirim email (misalnya email pendaftaran), saya akan membuat akun pengguna dan mengirim sinyal ke Layanan Windows saya (untuk mengirim email) dalam transaksi. Penangan pesan di sisi layanan akan mengambil pesan dan memprosesnya.

Sejak ASP .NET 4.0 dan AppFabric telah dirilis, ada sejumlah alternatif yang layak untuk mekanisme di atas. Mengacu kembali ke pertanyaan yang saya sebutkan di atas, kami sekarang memiliki AppInitialize AppFabric (via net. pipa) serta ASP .NET 4.0 fitur Auto-Start yang membuat pengembangan Layanan Windows sebagai aplikasi web alternatif yang layak. Saya sudah mulai melakukan ini sekarang karena sejumlah alasan (alasan terbesar) menjadi penyebaran tidak lagi menyebalkan):

  1. Anda dapat mengembangkan UI web di atas layanan Anda (karena berjalan sebagai aplikasi web). Ini sangat berguna untuk melihat apa yang terjadi pada saat runtime.
  2. Model penerapan Anda untuk aplikasi web Anda akan berfungsi untuk aplikasi layanan Anda.
  3. IIS menyediakan beberapa fitur yang rapi untuk menangani kegagalan aplikasi (serupa dalam beberapa hal dengan Layanan Windows).
  4. Pengembang web sangat akrab dengan mengembangkan aplikasi web (secara alami), sebagian besar tidak tahu banyak tentang praktik terbaik ketika mengembangkan Layanan Windows.
  5. Ini memberikan sejumlah alternatif untuk mengekspos API untuk dikonsumsi aplikasi lain.

Jika Anda menggunakan rute ini (maafkan saya karena menyalin dan menempelkan dari posting asli saya) saya pasti akan mempertimbangkan menjalankan logika latar belakang dalam aplikasi web yang terpisah. Ada beberapa alasan untuk ini:

  1. Keamanan . Mungkin ada model keamanan yang berbeda untuk UI yang menampilkan informasi tentang proses latar belakang yang sedang berjalan. Saya tidak ingin mengekspos UI ini kepada orang lain selain tim ops. Selain itu, aplikasi web dapat berjalan sebagai pengguna lain yang memiliki set izin yang lebih tinggi.
  2. Pemeliharaan . Akan sangat bagus untuk dapat menerapkan perubahan pada aplikasi yang menjadi tuan rumah proses latar belakang tanpa berdampak pada pengguna yang menggunakan situs web front end.
  3. Kinerja . Setelah aplikasi dipisahkan dari situs utama, memproses permintaan pengguna berarti bahwa utas latar belakang tidak akan mengurangi kemampuan IIS untuk menangani antrian permintaan yang masuk. Selanjutnya, aplikasi yang memproses tugas-tugas latar belakang dapat dikerahkan ke server terpisah jika diperlukan.

Melakukan ini akan kembali ke aspek marshaling. WCF, NServiceBus/RabbitMQ/ActiveMQ dll., Vanilla MSMQ, RESTful API (pikirkan MVC) adalah semua opsi. Jika Anda menggunakan Windows Workflow 4.0, Anda dapat mengekspos titik akhir Host yang dapat dikonsumsi aplikasi web Anda.

Pendekatan web hosting untuk layanan masih cukup baru bagi saya, hanya waktu yang akan menentukan apakah itu pilihan yang tepat. Sejauh ini baik baik saja. Ngomong-ngomong, jika Anda tidak ingin menggunakan AppFabric (saya tidak bisa karena untuk beberapa alasan aneh, Windows Server Web Edition tidak didukung), kemampuan Mulai Otomatis yang disebutkan dalam pos Gu berfungsi dengan baik. Tetap jauh dari file applicationhost.config, semua yang ada di postingan tersebut dapat diatur melalui konsol IIS (Editor Konfigurasi pada level server utama).

Catatan: Saya awalnya memposting beberapa tautan lagi dalam pesan ini tetapi sayangnya, ini adalah posting pertama saya untuk pertukaran ini dan hanya satu tautan yang didukung! Pada dasarnya ada dua orang lain, untuk memberi mereka Google "Death to Windows Services ... Long Live AppFabric!" dan "auto-start-asp-net-application". Maaf soal itu.

17
Rohland

Sebenarnya ada cara ketiga di Windows untuk menjalankan layanan latar belakang, dan ini sangat umum di dunia UNIX. Cara ketiga adalah pekerjaan CRON yang menjalankan sebagian infrastruktur Anda. Di Windows ini dikenal sebagai task scheduler dan sangat umum untuk menjalankan kode berdasarkan jadwal. Untuk menggunakan ini, Anda akan membuat aplikasi baris perintah yang dijalankan pada jadwal yang ditentukan sebelumnya. Keuntungan dari ini adalah Anda tidak perlu khawatir jika prosesnya tetap berjalan dan berjalan seperti layanan, karena jika gagal karena suatu alasan, itu akan mulai lagi di lain waktu.

Sedangkan untuk mengatur tugas-tugas tertentu, Anda benar-benar hanya perlu menyimpan tugas-tugas ini dalam penyimpanan biner yang persisten. Sampai aplikasi baris perintah mengambil mereka dari penyimpanan dan mengeksekusi mereka. Saya telah melakukan ini di masa lalu menggunakan database Cassandra sebagai Penyedia Status Sesi untuk menjejali tugas latar belakang untuk pengguna tertentu di database Cassandra, dan kemudian memiliki commandline mengambilnya dan menjalankannya untuk pengguna.

Ini mungkin bukan solusi rawa-rawa yang umum, tetapi ini bekerja sangat baik untuk saya dan ternyata menjadi solusi yang sangat elegan, karena tugas-tugas yang dijadwalkan selamat dari shutdown, masalah jaringan, dan mesin apa pun yang dapat menjalankan tugas karena itu terpusat disimpan.

Promosi yang memalukan, tetapi ini adalah proyek saya dan solusi yang saya jelaskan secara singkat adalah alasan saya membuat proyek: http://github.com/managedfusion/fluentcassandra/

22
Nick Berardi

Aplikasi Cron + Web

Ini adalah desain teruji perang yang skala secara horizontal bersama dengan pertanian web Anda dan memastikan bahwa Anda menggunakan tumpukan teknologi web Anda sudah tahu.

Begini cara kerjanya:

  1. Buat pengontrol/aksi di aplikasi web Anda untuk menangani tugas latar belakang terjadwal. Dengan konvensi, saya biasanya menyebut milik saya http://mydomain.com/system/cron.
  2. Untuk keamanan, tindakan ini harus dikunci hanya untuk alamat IP yang diautentikasi pada jaringan lokal.
  3. Pada mesin terpisah, instal Wget dan atur a Tugas Terjadwal agar wget mengambil sumber daya dari langkah 1. Anda dapat membuat tugas berjalan sesering yang Anda inginkan (saya biasanya pilih selama 30 detik). Jangan lupa untuk meneruskan argumen cookie yang sesuai ke Wget sehingga itu diautentikasi ke aplikasi web Anda.
  4. Untuk redundansi, Anda juga dapat menginstal wget terjadwal kedua pada mesin kedua.

Hore! Sekarang Anda memiliki rute yang akan dipanggil setiap 30 detik. Dan jika permintaan membutuhkan waktu 5 menit untuk diproses, tidak ada yang akan peduli, karena itu bukan bagian dari permintaan halaman pengguna.

Tindakan cron berakhir tampak sangat sederhana: ia memiliki daftar metode untuk dieksekusi pada frekuensi tertentu. Ketika permintaan masuk, dia melihat apakah ada metode yang perlu dieksekusi dan memanggil metode yang sesuai. Ini berarti Anda dapat mengontrol jadwal di basis data Anda , di mana Anda mungkin sudah memiliki banyak data konfigurasi penting lainnya untuk situs Anda.

Lebih penting lagi (untuk Anda), ini berarti bahwa pekerjaan Anda tidak harus dipanggil pada jadwal yang tetap. Anda dapat menulis logika apa pun yang Anda inginkan untuk menentukan kapan harus mengeksekusi suatu metode.

Pro dan kontra

  • Anda sudah sangat pandai menulis kode ASP.NET MVC, jadi ini memungkinkan Anda menulis tugas latar belakang di platform yang sama yang Anda tulis di sisa solusi Anda di.
  • Tugas berjalan dalam konteks yang sama dengan aplikasi web Anda, sehingga Anda dapat berbagi cache dan memanfaatkan pembantu metode yang sudah ada.
  • Jika Anda ingin mengambil URI yang seimbang , maka tugas latar belakang Anda sekarang juga seimbang.
  • Penempatan serentak - Anda tidak perlu khawatir tentang menyinkronkan aplikasi web Anda dengan logika tugas latar belakang Anda, karena mereka semua dalam penyebaran yang sama.
  • Selama bertahun-tahun, beberapa orang mengatakan kepada saya bahwa desain ini "sangat berpasangan", tetapi ketika ditekan mereka belum dapat mengartikulasikan mengapa itu adalah hal yang buruk.

Catatan: Jika ada pertanyaan atau masalah, silakan tambahkan komentar. Saya senang menguraikan.

10
Portman

Saya telah mencoba dan menggunakan hampir setiap cara yang mungkin untuk melakukan ini dalam aplikasi saya saat ini. Saya mulai melakukan hal yang sama seperti yang Anda lakukan saat ini, membuntuti permintaan pengguna untuk mengisi data dan kemudian menyimpannya. Saya menyadari ini adalah ide yang buruk juga (terutama karena Anda skala ke beberapa server web, lebih banyak pengguna menerima pukulan).

Saya juga telah memiliki pekerjaan yang dijadwalkan yang mengenai URL di aplikasi ASP.NET - ini adalah solusi yang layak tetapi mulai memecah saat Anda skala melewati 1 server web.

Saat ini saya menggunakan dua metode yang berbeda, keduanya menggunakan Quartz.NET yang merupakan perpustakaan kecil yang hebat. Yang pertama adalah Quartz.NET berjalan dalam proses dengan ASP.NET, itu adalah setup di global.asax dan berjalan setiap beberapa menit. Saya menggunakan ini untuk memperbarui cache ASP.NET keluar dari band yang merupakan satu-satunya alasan dijalankan sebagai bagian dari ASP.NET.

Yang kedua adalah bahwa saya menulis perpustakaan untuk membungkus Quartz.NET disebut DaemonMaster - membuatnya mudah untuk menjatuhkan DLL ke direktori dan menjalankannya dalam layanan Windows. Saya menemukan itu membantu menghindari beberapa bagian menjengkelkan dari bekerja dengan Layanan Windows dan juga membersihkan api Quartz.NET beberapa Layanan yang dijalankan melalui DaemonMaster memiliki dua rasa yang berbeda, yang pertama adalah pekerjaan yang perlu dijalankan setiap malam atau setiap minuts X. pekerjaan lain bekerja dari antrian berdasarkan pada data yang datang dari aplikasi ASP.NET. Aplikasi ASP.NET menjatuhkan objek JSON pada RabbitMQ dan polling layanan RabbitMQ kemudian memproses data.

Berdasarkan ini saya akan menyarankan Anda pergi dengan layanan Windows (dan periksa DaemonMaster) dan jika perlu gunakan antrian seperti RabbitMQ untuk meneruskan data dari aplikasi ASP.NET ke layanan - itu telah bekerja dengan baik dari semua solusi ini . Jika Anda memuat cache kemudian menjalankan di ASP.NET masuk akal, kalau tidak saya tidak berpikir begitu.

7
James Avery

Saya akan melakukannya dengan cara yang benar dan menjalankan Layanan Windows yang memantau "antrian". Saya mengatakan "antrian" karena pemrograman dengan MSMQ mirip dengan menempelkan hot pokers di bola mata Anda.

Saya telah jatuh cinta dengan kesederhanaan Tertunda :: Pekerjaan di Rails, dan hal serupa dapat dengan mudah dilakukan di .NET.

Pada dasarnya Anda menambahkan segala jenis SomethingOperation (sesuatu yang memiliki metode Perform()). Kemudian hanya membuat serial parameter yang relevan, berikan prioritas, semacam perilaku coba lagi default dan masukkan ke dalam database.

Layanan Anda hanya akan memonitor ini dan mengerjakan pekerjaan dalam antrian.

6
Ben Scheirman

Kami sangat senang dengan pendekatan Bus Layanan/Antrian Pesan/Layanan. Arsitektur dasarnya adalah ini.

Situs web mengirim pesan ke antrian

bus.Send(new ProjectApproved()); // returns immediately

Layanan Windows menerima dan memproses pesan pada waktunya sendiri

public class DoesSomethingAwesome : ConsumerOf<ProjectApproved>
{
   public void Consume(ProjectApproved Message)
   {
      // Do something "offline"
   }
}

Keuntungannya adalah tidak ada penundaan untuk layanan front-end yang terhubung dengan pengguna juga. Layanan windows dapat dimatikan dan ditingkatkan tanpa gangguan ke situs utama. Plus itu sangat cepat.

Jika Anda tidak dapat menyimpan semua data dalam pesan, Anda selalu dapat menyimpannya dan mengambilnya nanti. Saya sarankan menggunakan mekanisme penyimpanan dokumen seperti: RavenDB atau MongoDB di mana sangat mudah untuk menyimpan kelas Anda tanpa perubahan.

Situs web mengirim pesan ke antrian

// Save your object
store.Save(completeProject);

// Send a message indicating its ready to be processed
bus.Send(new ProjectApproved() { ProjectId = completeProject.Id });

Layanan Windows menerima dan memproses pesan pada waktunya sendiri

public class DoesSomethingAwesome : ConsumerOf<ProjectApproved>
{
   public void Consume(ProjectApproved Message)
   {
      // Retrieve your object back
      var completeProject = store.Get(Message.ProjectId);
   }
}

Untuk mempermudah, kami menggunakan: Rhino ESB dan Topshelf . Konfigurasi ini sangat sederhana dan menempatkan ini untuk aplikasi yang sudah ada terbukti membutuhkan waktu yang sangat sedikit.

4
Nathan Palmer

Saya ingin tahu mengapa kombinasi keduanya bukan pilihan yang layak. Saat ini Anda memicu pekerjaan pada tampilan halaman, dengan beberapa getah sial macet menunggu 10 detik untuk halaman muncul. Setidaknya itulah pemahaman saya tentang metode Anda saat ini.

Namun pekerjaan itu membutuhkan waktu lebih lama dan lebih lama untuk berjalan seiring pertumbuhan situs, dan Anda tidak ingin menggagalkan pengalaman pengguna di situs. Bahkan untuk beberapa (atau mungkin banyak) pengguna sial sepanjang hari, jadi sekarang Anda berpikir tentang menjadwalkan pekerjaan di latar belakang.

Saya tidak mengerti mengapa pekerjaan latar belakang berjalan secara berkala tidak dapat meniru pengunjung. Sekarang saya bukan programmer Windows, tetapi di dunia Linux saya akan mengatur pekerjaan cron yang berjalan pada interval reguler, dan itu akan memiliki 2 baris kode.

#!/bin/bash
wget -O /dev/null http://stackoverflow.com/specially_crafted_url

Ini menggabungkan pro dari kedua sistem. Itu dilakukan di latar belakang. Itu tidak mempengaruhi pengguna. Masih menggunakan tampilan halaman untuk memulai pekerjaan. Saya telah melihat pendekatan ini digunakan sebelumnya. Itu cenderung menjadi jalan tengah antara cara-cara sederhana yang lama, dan cara-cara yang lebih rumit yang muncul.

Perbarui

Saya pikir Anda bisa mengatasi masalah penyeimbangan beban dengan menjalankan pelari pekerjaan di server web sendiri. Pelari pekerjaan menarik URL dari antrian pekerjaan, dan menjalankannya seperti ini:

wget -O /dev/null http://localhost/specially_crafted_url

Karena sifat antrian pekerjaan/perpesanan, pekerjaan tersebut akan didistribusikan secara merata di antara para pelari kerja, yang berarti special_crafted_url akhirnya didistribusikan di antara server web Anda.

3
mellowsoon

Saya pikir kontra dengan pendekatan layanan murni adalah bahwa Anda memiliki kode yang tersebar ke dalam layanan dan jauh dari aplikasi inti.

Inilah yang telah kami lakukan dengan pekerjaan latar belakang non sensitif waktu yang besar, yang menjaga kode bersama dan menyederhanakan layanan:

  1. Buat antrian pekerjaan (baik dalam memori atau DB, apa pun kegigihan yang diperlukan untuk jenis pekerjaan)
  2. Buat layanan web yang akan menjalankan pekerjaan yang antri
  3. Aplikasi layanan mati sederhana yang memanggil layanan web pada interval yang ditentukan, meninggalkan semua hal yang kompleks (pengambilan pekerjaan dan eksekusi) ke layanan web dalam basis kode inti Anda.

Lebih sederhana lagi, cukup buat panggilan di aplikasi konsol dan gunakan Penjadwal Tugas atau VisualCron untuk mengubahnya menjadi "layanan".

2
Brandon

Resque is Nice. Atau bahkan Kthxbye jika Anda perlu diberitahu tentang nilai yang dihasilkan setelah selesai.

Keduanya berbasis Redis/Ruby.

Jujur, jika Anda melakukan pendekatan berbasis layanan, itu benar-benar tidak perlu super-terintegrasi dengan platform Anda saat ini, yang saya rasa merupakan nilai tambah. Saya berharap itu bisa menjadi sistem set-and-forget yang akan berjalan (dengan pemantauan semacam) dan menyelesaikan pekerjaan. Saya tidak yakin itu harus dijalankan pada platform yang sama sekali karena hanya memperbarui/memodifikasi info basis data.

Cukup yakin Anda bisa jauh lebih banyak dengan lebih sedikit jika Anda bertani ini bekerja untuk entitas yang terpisah, terutama karena tampaknya Anda sedang berurusan dengan masalah threading. Baik Resque dan Kthxbye pindahkan pemrosesan ke proses yang terpisah untuk memungkinkan OS menangani konkurensi.

Resque

Kthxbye

1
Lukas

Saya suka TopShelf. Menjaga kesederhanaan, namun tetap melakukannya dengan cara yang benar berjalan sebagai Layanan Windows. Pada dasarnya buat Aplikasi Konsol, tambahkan sekitar 15-20 baris kode, lalu instal sebagai layanan.

http://code.google.com/p/topshelf/

1
Shane

Bagaimana dengan memiliki layanan Windows yang sangat sederhana yang berjalan di server web dan secara berkala mengenai URL pemeliharaan yang melakukan tugas-tugas lain Anda. Apakah itu mencekik berapa banyak pekerjaan yang dilakukannya dalam setiap permintaan yang diberikan.

1
Rob Sobers

Saya akan melawan tren nyata di sini dan menyarankan untuk menggunakan model in-IIS. Saya sudah menggunakannya sendiri dan bekerja dengan sangat baik. Benar-benar tidak sulit untuk mengimplementasikan kelas thread-pool yang layak (selama bertahun-tahun, saya telah memperpanjang kelas thread-pool saya untuk mendukung penciptaan dan penghancuran thread yang dinamis, mencoba kembali pekerjaan dan sebagainya). Keuntungannya adalah:

  • Tidak ada layanan eksternal untuk dipantau
  • Kesederhanaan implementasi: tidak ada proses lintas proses, tidak ada pemantauan pekerjaan tingkat lanjut
  • Anda masih di dalam IIS, sehingga Anda dapat melakukan semua pencatatan seperti biasa dan seterusnya (tidak perlu banyak file log)
  • Penyebaran yang sangat disederhanakan (saat Anda memperbarui layanan, Anda harus menghentikan layanan, menyalin file, memulai layanan - ini merupakan tambahan untuk pembaruan biasa ke kode situs web)

Menurut pendapat saya, solusi di-IIS hanyalah "langkah selanjutnya" dari memboncengkan pekerjaan ke tampilan halaman acak.

1
Dean Harding

Antrian Tugas Java Tinjauan API

Konsep Tugas
Dalam pemrosesan latar belakang App Engine, tugas adalah deskripsi lengkap dari unit kerja kecil. Deskripsi ini terdiri dari dua bagian:

  • Payload data yang menentukan parameter tugas.
  • Kode yang mengimplementasikan tugas.

Tugas sebagai Kait Web Offline
Untungnya, Internet sudah menyediakan solusi seperti itu, dalam bentuk permintaan HTTP dan tanggapannya. Payload data adalah isi permintaan HTTP, seperti variabel formulir web, XML, JSON, atau data biner yang disandikan. Referensi kode adalah URL itu sendiri; kode aktual adalah logika apa pun yang dijalankan server dalam menyiapkan respons.

0
antony.trupe

Saya akan menggunakan layanan WCF yang di-hosting WAS mendengarkan Antrian MSMQ.

Pro

  • Api dan lupakan pesan satu arah dari aplikasi web

  • Throttling dan coba ulang MSMQ/WCF

  • Pengiriman terjamin; D

  • Manajemen Surat Mati

  • Pemrosesan terdistribusi

  • Aktivasi WAS/MSMQ

Con

  • MSMQ (belum mati ... Belum)

Fitur MSMQ di WCF membuat penggunaan MSMQ sangat bagus. Ya, Anda akan kehabisan konfigurasi tetapi manfaatnya akan lebih besar dari pengorbanan.

0
Adam

Saya pernah mengalami ini beberapa kali ketika mengembangkan aplikasi web. Kami telah menyelesaikannya dengan membuat aplikasi konsol windows yang melakukan tugas, dan membuat tugas terjadwal yang berjalan sesering mungkin untuk benar-benar melakukan tugas tersebut.

0
John Christensen

Anda dapat shunt bekerja ke utas latar belakang (atau banyak utas latar belakang) menggunakan Rx dan sesuatu seperti berikut:

var scheduler = new EventLoopScheduler( SchedulerThreadName );
_workToDo = new Subject<Action>();
var queueSubscription = _workToDo.ObserveOn( scheduler ).Subscribe( work => work() );
_cleanup = new CompositeDisposable( queueSubscription, scheduler );

Menggunakan:

var work = () => { ... };
_workToDo.OnNext( work ); // Can also put on error / on complete in here

Host semua itu di dalam kelas yang hanya ada satu (alias singleton, tetapi lakukan dengan benar - gunakan wadah IoC Anda untuk menentukan gaya hidup).

Anda dapat mengontrol ukuran kumpulan utas dll dengan menulis penjadwal kustom sebagai pengganti menggunakan EventLoopScheduler (yang menjalankan utas tunggal).

0
Neal

Lakukan keduanya

Tambahkan parameter opsional ke jalur pertanyaan yang berfungsi saat Anda membonceng permintaan pengguna:

Melayani tugas latar belakang di situs besar

Buat aplikasi konsol yang berjalan di setiap server dan buka biner bersama log IIS dan bacakan ke akhir file saat ini. Gunakan pengamat filesystem atau interval waktu untuk membaca dan mengumpulkan pembaruan sebagai IIS memerah log.

Gunakan informasi ini untuk menentukan halaman apa yang saat ini dilihat.

Gunakan url halaman dari log yang diuraikan untuk memanggil versi "extrastuff" dari url di localhost dengan objek klien web.

Tambahkan beberapa kode untuk beralih file pada akhir setiap periode log atau memulai kembali proses setiap periode log.

0
Bill

Saya telah menerapkan hal semacam ini beberapa kali. Di windows, saya mengatur program baris perintah python yang melakukan sesuatu pada berbagai waktu. Program ini juga memperlihatkan antarmuka xmlrpc pada port. Kemudian, tugas tugas terjadwal berjalan setiap menit dan menanyakan antarmuka xmlrpc. Jika tidak ada, ia mencoba untuk meluncurkannya. Jika tidak bisa, itu mengirim saya email.

Keuntungannya adalah bahwa pekerjaan yang dijalankan tidak terikat cron atau jadwal. Saya memiliki pekerjaan proses yang berjalan setiap detik, tetapi akan menunggu lebih lama antara memulai pekerjaan baru tergantung pada apakah pekerjaan itu harus dilakukan. Selain itu, dapat digunakan untuk bertindak secara cerdas berdasarkan hasil. Punya 500 kesalahan? Punya penundaan sangat lama? Lakukan sesuatu yang lain. Beri tahu layanan lain. Dll.

Dan sistem yang sama berfungsi pada unix, dengan sedikit modifikasi.

0

Saya tidak punya jawaban untuk Anda sendiri, tetapi masalahnya berbunyi lonceng - Saya ingat beberapa orang acak mendiskusikannya di podcast sekali .

Spolsky: Saya perhatikan salah satu pertanyaan yang Anda tanyakan di blog adalah bagaimana seharusnya Anda menangani tugas pemeliharaan rutin secara umum?

Atwood: Ya.

Spolsky: Apakah itu karakterisasi yang adil? Setiap situs web memiliki beberapa tugas yang tidak ingin Anda lakukan pada saat halaman web dimuat, tetapi Anda ingin menjalankannya dengan semacam pengulangan.

Atwood: Ya, tugas-tugas latar belakang semacam itu.

Spolsky: Ya, jadi apa yang Anda pikirkan?

Atwood: Ya, saya awalnya bertanya di Twitter, karena saya hanya menginginkan sesuatu yang ringan. Saya benar-benar tidak ingin suka menulis layanan windows. Saya merasa seperti itu keluar dari kode band. Ditambah kode yang benar-benar berfungsi adalah halaman web pada kenyataannya, karena bagi saya yang merupakan unit kerja logis pada situs web adalah halaman web. Jadi, ini seperti kita menelepon kembali ke situs web, itu seperti permintaan lain di situs web, jadi saya melihatnya sebagai sesuatu yang harus tetap sejalan, dan sedikit pendekatan yang kami lakukan yang direkomendasikan kepada saya di Twitter pada dasarnya adalah untuk menambahkan sesuatu ke cache aplikasi dengan kedaluwarsa tetap, maka Anda memiliki panggilan kembali sehingga ketika yang kedaluwarsa itu memanggil fungsi tertentu yang berfungsi kemudian Anda menambahkannya kembali ke cache dengan kedaluwarsa yang sama. Jadi, ini sedikit, mungkin "ghetto" adalah kata yang tepat.

0
Oddthinking