Zeromq-trading-system

Zeromq-trading-system

Live-forex-trade-calls
H4-forex-trading-strategy
Free-forex-trading-signal-update-hourly


Strategi forex ninjatrader maju Martingale-biner-strategi pilihan Binary-option-trading-simulator Free-auto-forex-trader Win-tie-win-trading-signal-review Posisi buka Forex akhir pekan

Zeromq-dev Dapatkah Platform Perdagangan bergantung pada OslashMQ Saya memiliki klien pertukaran keuangan di mana data (pasar) harus dilewatkan dari sistem perdagangan inti ke gudang melalui TCPIP. Apa yang saya terus lihat di Panduan adalah bahwa dalam beberapa kasus yang jarang, MQ menjatuhkan pesan tanpa suara, jika tidak ada strategi yang jelas untuk pulih dari kesalahan kuota. Jelas kita tidak bisa membiarkan pesan yang dijatuhkan diabaikan dibuang diam-diam. Saya akan melalui panduan ini, dan bermain dengan beberapa pola untuk merasakan API MQ API dan filosofi yang lebih baik, namun saya sangat menghargai pengetahuan seseorang yang sudah cukup kompeten dengan produk tersebut untuk menyelamatkan saya beberapa oilpot quotmidnight: 1. Apakah ada mekanisme built in misalnya Mulailah memuat pesan ke disk, seandainya antrean hampir dilipat Atau hanya berhenti STOP daripada membuang pesan secara diam-diam 2. Kotak Hitam Madu adalah sesuatu yang paling mirip dengan apa yang kita butuhkan, namun kita sudah memiliki penerbit sendiri yang dibelokkan. Akan memangkasnya lebih jauh ke dalam kuotasi Pelanggan yang berbeda agar diperlukan untuk menghindari luapan kuota yang berlebihan (misalnya, sisi pemrosesan akan lebih lambat, karena ini memerlukan protobuf dan pratinjau google yang mungkin ada ke disk) 3. Jika jawaban ke 3 adalah YA, bukan merupakan tambahan Internal sharding memperkenalkan titik kegagalan baru (misalnya thread mati, dll.), Dalam hal ini ada semacam mekanisme pemulihan retry (mirip dengan PGM, namun sedikit tingkat yang lebih tinggi, karena kita berurusan dengan Pesan ZMTP) Cari Diskusi Martin Sustrik Hi Anatoly, Ada pilihan ZMQSWAP dalam versi 2.x. Menerapkan backpressure (quotSTOPquot) bekerja dengan pola REQREP dan PUSHPULL. Dengan PUBSUB, penerapan backpressure dikombinasikan dengan pelanggan slowdead dapat menyebabkan latency tak terbatas, bahkan sampai kebuntuan keseluruhan sistem distribusi pesan. Saya kira Anda berbicara tentang data pasar di sini. Jika penerbit kelebihan beban, pikirkan untuk membuat topologi yang lebih kompleks dengan perangkat di tengah untuk mendistribusikan muatan. Jika titik yang menyimpan pesan pada 7 September 2011 pukul 6:51 pagi 1. Apakah ada mekanisme yang dibangun untuk mis. Mulai memuat pesan ke disk, seandainya antrian hampir dilipat Atau hanya berhenti karena tidak membuang pesan secara diam-diam Ada opsi ZMQSWAP dalam versi 2.x. Menerapkan backpressure (quotSTOPquot) bekerja dengan pola REQREP dan PUSHPULL. Dengan PUBSUB, penerapan backpressure dikombinasikan dengan pelanggan slowdead dapat menyebabkan latency tak terbatas, bahkan sampai kebuntuan keseluruhan sistem distribusi pesan. 2. Mad Black Box adalah sesuatu yang terlihat paling dekat dengan apa yang kita butuhkan, namun kita sudah memiliki penerbit sendiri yang dibelokkan. Akan memangkasnya lebih jauh ke dalam kuotasi Pelanggan yang berbeda agar diperlukan untuk menghindari luapan kuota yang berlebihan (misalnya, sisi pemrosesan akan lebih lambat, karena ini memerlukan protobuf dan pratinjau google yang cenderung berlanjut ke disk) Saya rasa Anda berbicara tentang data pasar di sini. Jika penerbit kelebihan beban, pikirkan untuk membuat topologi yang lebih kompleks dengan perangkat di tengah untuk mendistribusikan muatan. 3. Jika jawaban ke 3 adalah YA, bukan sharding internal tambahan yang mengenalkan titik kegagalan baru (misalnya benang mati, dll.), Dalam hal ini ada semacam mekanisme pemulihan retry (mirip dengan mekanisme coba ulang PGM, tapi sedikit tingkat yang lebih tinggi, karena kita berurusan dengan pesan ZMTP) Jika titik yang menyimpan pesan mati, pesannya hilang. Itu berlaku untuk PGM atau mekanisme lainnya. Satu-satunya pilihan adalah menyimpan pesan di disk, dengan hukuman kinerja yang jelas. Bahkan saat itu, jika disk mati, pesannya hilang. Untuk mencegah bahwa Anda harus menyimpannya di RAID, SAN atau somesuch. Jika keseluruhan RAID dihancurkan, dll. Pada Rabu, 7 September 2011 pukul 2:51, Martin Sustrik menulis: 1. Apakah ada mekanisme built in mis. Mulai memuat pesan ke disk, seandainya antrian hampir dilipat Atau hanya berhenti karena tidak membuang pesan secara diam-diam Ada opsi ZMQSWAP dalam versi 2.x. Menerapkan backpressure (quotSTOPquot) bekerja dengan pola REQREP dan PUSHPULL. Dengan PUBSUB, penerapan backpressure dikombinasikan dengan pelanggan slowdead dapat menyebabkan latency tak terbatas, bahkan sampai kebuntuan keseluruhan sistem distribusi pesan. 2. Mad Black Box adalah sesuatu yang terlihat paling dekat dengan apa yang kita butuhkan, namun kita sudah memiliki penerbit sendiri yang dibelokkan. Akan memangkasnya lebih jauh ke dalam kuotasi Pelanggan yang berbeda agar diperlukan untuk menghindari luapan kuota yang berlebihan (misalnya, sisi pemrosesan akan lebih lambat, karena ini memerlukan protobuf dan pratinjau google yang cenderung berlanjut ke disk) Saya rasa Anda berbicara tentang data pasar di sini. Jika penerbit kelebihan beban, pikirkan untuk membuat topologi yang lebih kompleks dengan perangkat di tengah untuk mendistribusikan muatan. 3. Jika jawaban ke 3 adalah YA, bukan sharding internal tambahan yang mengenalkan titik kegagalan baru (misalnya benang mati, dll.), Dalam hal ini ada semacam mekanisme pemulihan retry (mirip dengan mekanisme coba ulang PGM, tapi sedikit tingkat yang lebih tinggi, karena kita berurusan dengan pesan ZMTP) Jika titik yang menyimpan pesan mati, pesannya hilang. Itu berlaku untuk PGM atau mekanisme lainnya. Satu-satunya pilihan adalah menyimpan pesan di disk, dengan hukuman kinerja yang jelas. Bahkan saat itu, jika disk mati, pesannya hilang. Untuk mencegah bahwa Anda harus menyimpannya di RAID, SAN atau somesuch. Jika seluruh RAID rusak dll. PEMBAWA: Teks ini sudah tidak berlaku lagi dan mengacu pada versi lama MQ. Ini tetap di sini untuk kepentingan sejarah. JANGAN GUNAKAN INI UNTUK MEMPELAJARI MQ. Pendahuluan Karena MQ terutama ditujukan untuk bisnis perdagangan saham listrik, kami menciptakan sebuah aplikasi contoh yang mensimulasikan kerja internal bursa saham. Fokus utama dari contoh ini adalah untuk menunjukkan bagaimana kinerja MQ dalam skenario mirip dunia nyata. Diagram di bawah ini menunjukkan arsitektur aplikasi: Komponen Gateway harus mendapat perintah dari pedagang melalui jaringan (menggunakan protokol FIX atau protokol proprietary tertentu) dan mengirim balasan kembali ke pedagang. Namun, sebagai contoh aplikasi dimaksudkan untuk menunjukkan seberapa besar kemungkinan throughputsensiensi sistem seperti itu, gateway menghasilkan perintah acak alih-alih menerimanya dari pedagang. Saat memulai gateway, Anda bisa menentukan jumlah pesanan per detik yang akan dihasilkan. Unit pencocokan berisi inti logika bisnis bursa saham. Ini sesuai dengan pesanan satu sama lain dan menghasilkan perdagangan dan penawaran. Implementasi kami minimalis, berdasarkan algoritma pencocokan timeprice (menerapkan algoritma pro rata dibiarkan sebagai excercise untuk pembaca). Namun, algoritma ini memiliki kompleksitas O (1) dan sangat dioptimalkan. Kami melihat prosesnya sekitar 18 juta pesanan per detik. Komponen statistik menerima info kinerja yang dihasilkan oleh kedua gateway dan mesin pencocokan dan menampilkannya dalam bentuk yang dapat dibaca manusia. Untuk membuat pembacaan statistik menjadi lebih mudah, alat grafis sederhana disertakan dalam contoh. Kinerja Berikut screenshot menunjukkan contoh kinerja pada dua kotak high-end 8-core (3GHz) masing-masing memiliki 2 NIC 1GbE khusus. Perlu diingat bahwa jika Anda menjalankannya di perangkat keras yang tidak disebutkan dan yang tidak dapat diperbaiki, masih dapat berjalan cukup cepat, namun Anda akan mengalami throughput pesan yang lebih rendah dan puncak latensi yang lebih banyak. Jika Anda mengatur tingkat pesan terlalu tinggi, Anda bahkan dapat mengalami kegagalan gatway karena komponen ticker yang digunakan untuk mengirim pesanan pada tingkat stabil tidak dapat diimbangi. Garis kuning menunjukkan latency roundtrip, yaitu berapa lama waktu yang dibutuhkan untuk menyampaikan perintah dari gateway ke mesin pencocokan, mengolahnya dan mengirim konfirmasi pesanan kembali ke gateway. Dalam latency uji kami berfluktuasi sekitar 200 mikrodetik rata-rata. Garis throughput yang lebih rendah (900.000 messagessecond) adalah tingkat perintah yang dilewati dari pintu gerbang ke mesin pencocokan. Garis throughput atas (2.300.000 messagessecond) adalah tingkat konfirmasi pesanan, perdagangan dan harga saham yang dilewatkan dari mesin pencocokan ke gateway. Secara total, kita melihat sekitar 3.200.000 pesan per detik yang melewati jaringan. Membangunnya Untuk membangun contoh gunakan opsi pertukaran dengan opsi: Untuk dapat menjalankan alat grafik Anda harus menginstal Perl-Tk (dikemas seperti perl-tk pada Debian) serta Tk :: Graph dari CPAN . Menjalankannya Sebagai contoh, kita memiliki topologi jaringan berikut untuk menjalankan contoh di. Kotak mewakili mesin individual, panah mewakili kabel fisik antara masing-masing antarmuka jaringan (ditandai dengan alamat IP masing-masing): Ada 3 kotak (test01, test02 dan test03) yang terhubung ke jaringan switched dengan masing-masing alamat IP 192.168.0.1, 192.168.0.2 Dan 192.168.0.3. Apalagi ada dua koneksi langsung antara test02 dan test03. Satu koneksi menghubungkan antarmuka jaringan 10.0.0.1 pada test02 dengan antarmuka jaringan 10.0.0.2 pada test03. Yang lainnya menghubungkan antarmuka jaringan 10.1.0.1 pada test02 dengan antarmuka jaringan 10.1.0.2 pada test03. Zmqserver yang dikelola dengan baik dan komponen statistik pada test01, mesin pencocokan pada test02 dan gateway pada test03. Gunakan salah satu koneksi langsung antara test02 dan test03 untuk melewati perintah dari gatway ke mesin pencocokan dan yang lainnya melewati konfirmasi, perdagangan dan penawaran dari mesin pencocokan ke gateway. Pertama, mulai zmqserver pada test01: Kemudian mulai komponen statistik pada test01. Parameternya adalah kotak di mana zmqserver berjalan dan antarmuka jaringan menerima info statistik: Atau Anda dapat menyempot data statistik ke alat grafik: Sekarang, mulai mesin pencocokan. Sediakan nama host zmqserver, antarmuka untuk menerima pesan dan antarmuka untuk mengirim pesan sebagai parameter: Akhirnya, jalankan gatway. Menyediakan lokasi zmqserver dan jumlah pesanan untuk dikirim per detik sebagai parameter: Kesimpulan Contoh pertukaran memungkinkan Anda menguji kinerja MQ di skenario yang mirip dengan dunia nyata. Namun, mendapatkan latency yang stabil pada throughput yang tinggi adalah masalah yang rumit tergantung pada penyetelan keseluruhan perangkat keras, sistem operasi, lingkungan eksekusi, dll. Jika Anda serius dengan pengujian kinerja, hubungi kami untuk membantu Anda dalam tugas ini. Ditulis: 1218019882Y.m.e Revisi: 1286694428Y.m.e Jika Anda menemukan halaman ini berguna, tingkatkan nilainya sehingga orang lain akan menemukannya.OslashMQ adalah sistem pesan, atau middleware berorientasi pesan, jika Anda mau. Penggunaannya di lingkungan beragam seperti layanan keuangan, pengembangan game, embedded system, penelitian akademis dan dirgantara. Sistem pesan bekerja pada dasarnya sebagai pesan instan untuk aplikasi. Sebuah aplikasi memutuskan untuk mengkomunikasikan suatu kejadian ke aplikasi lain (atau beberapa aplikasi), ia mengumpulkan data yang akan dikirim, menyentuh tombol kirim dan di sana kita melihat kembali sistem pesan yang menangani sisanya. Tidak seperti pesan instan, meskipun, sistem pesan tidak memiliki GUI dan tidak menganggap manusia pada titik akhir mampu melakukan intervensi cerdas ketika ada yang tidak beres. Dengan demikian, sistem pesan harus benar-benar toleran terhadap kesalahan dan jauh lebih cepat daripada pesan instan biasa. OslashMQ awalnya dipahami sebagai sistem pesan ultra cepat untuk perdagangan saham dan fokusnya pada pengoptimalan yang ekstrem. Tahun pertama proyek dihabiskan untuk merancang metodologi benchmarking dan mencoba mendefinisikan arsitektur yang seefisien mungkin. Kemudian, kira-kira pada tahun kedua pembangunan, fokusnya beralih ke penyediaan sistem generik untuk membangun aplikasi terdistribusi dan mendukung pola perpesanan sewenang-wenang, berbagai mekanisme transportasi, binding bahasa yang sewenang-wenang, dan lain-lain. Selama tahun ketiga, fokusnya adalah pada peningkatan kegunaan Dan meratakan kurva belajar. Kami mengadopsi API Socket BSD, mencoba membersihkan semantik dari pola perpesanan individual, dan seterusnya. Mudah-mudahan, bab ini akan memberi wawasan bagaimana ketiga tujuan di atas diterjemahkan ke dalam arsitektur internal OslashMQ, dan memberikan beberapa tip bagi mereka yang sedang berjuang dengan masalah yang sama. Sejak tahun ketiga OslashMQ telah melampaui basis kode, ada inisiatif untuk menstandardisasi protokol kawat yang digunakannya, dan implementasi eksperimental dari sistem pesan seperti OslashMQ di dalam kernel Linux, dan lain-lain. Topik ini tidak dibahas dalam buku ini. Namun, Anda dapat memeriksa sumber online untuk informasi lebih lanjut: 250bpmconcepts. Groups.googlegroupsp-diskusi-kelompok. Dan 250bpmhits. 24.1. Aplikasi vs Perpustakaan OslashMQ adalah perpustakaan, bukan server pesan. Kami membutuhkan beberapa tahun untuk mengerjakan protokol AMQP, sebuah usaha industri keuangan untuk menstandardisasi protokol kawat untuk perpesanan bisnismembuat implementasi referensi untuknya dan berpartisipasi dalam beberapa proyek berskala besar yang didasarkan pada teknologi pesan untuk menyadari bahwa ada sesuatu yang salah dengan model clienterver klasik. Dari smart messaging server (broker) dan klien pesan bodoh. Perhatian utama kami saat ini adalah dengan kinerja: Jika ada server di tengah, setiap pesan harus melewati jaringan dua kali (dari pengirim ke broker dan dari broker ke penerima) yang memberikan penalti dalam hal kedua latency Dan throughput. Apalagi jika semua pesan tersebut dilewatkan melalui broker, pada titik tertentu pasti akan menjadi bottleneck. Perhatian sekunder terkait dengan penerapan skala besar: ketika penggelaran melintasi batas organisasi, konsep otoritas pusat yang mengelola keseluruhan aliran pesan tidak dapat diterapkan lagi. Tidak ada perusahaan yang mau menyerahkan kontrol ke server di perusahaan yang berbeda, ada rahasia dagang dan ada kewajiban hukum. Hasilnya adalah bahwa ada satu server pesan per perusahaan, dengan jembatan tangan untuk menghubungkannya ke sistem pesan di perusahaan lain. Seluruh ekosistem sangat terfragmentasi, dan mempertahankan sejumlah besar jembatan untuk setiap perusahaan yang terlibat tidak membuat situasi menjadi lebih baik. Untuk mengatasi masalah ini, diperlukan arsitektur terdistribusi penuh, arsitektur dimana setiap komponen dapat diatur oleh entitas bisnis yang berbeda. Mengingat bahwa unit manajemen dalam arsitektur berbasis server adalah server, kita bisa menyelesaikan masalah dengan menginstal server terpisah untuk masing-masing komponen. Dalam kasus seperti ini kita dapat lebih mengoptimalkan desain dengan membuat server dan komponen berbagi proses yang sama. Apa yang kita berakhir dengan adalah sebuah perpustakaan pesan. OslashMQ dimulai saat kami mendapat ide tentang bagaimana membuat pesan bekerja tanpa server pusat. Ini diperlukan untuk mengubah keseluruhan konsep pesan secara terbalik dan mengganti model penyimpanan pesan terpusat secara otonom di pusat jaringan dengan titik akhir cerdas, arsitektur jaringan bodoh berdasarkan prinsip end-to-end. Konsekuensi teknis dari keputusan tersebut adalah bahwa OslashMQ, sejak awal, adalah sebuah perpustakaan, bukan sebuah aplikasi. Sementara itu, kami dapat membuktikan bahwa arsitektur ini lebih efisien (latency lebih rendah, throughput lebih tinggi) dan lebih fleksibel (mudah untuk membangun topologi kompleks yang sewenang-wenang, alih-alih terkait dengan model hub and talk klasik). Salah satu konsekuensi yang tidak disengaja, bagaimanapun, adalah bahwa memilih model perpustakaan memperbaiki kegunaan produk. Berulang kali pengguna mengekspresikan kebahagiaan mereka tentang fakta bahwa mereka tidak perlu menginstal dan mengelola server olahpesan yang berdiri sendiri. Ternyata tidak memiliki server adalah pilihan yang lebih disukai karena mengurangi biaya operasional (tidak perlu ada admin server pesan) dan memperbaiki time-to-market (tidak perlu menegosiasikan kebutuhan untuk menjalankan server dengan klien, Manajemen atau tim operasi). Pelajarannya adalah bahwa ketika memulai sebuah proyek baru, Anda harus memilih desain perpustakaan jika memungkinkan. Cukup mudah untuk membuat aplikasi dari perpustakaan dengan memohonnya dari program sepele, hampir tidak mungkin membuat perpustakaan dari eks-executable yang ada. Perpustakaan menawarkan lebih banyak fleksibilitas kepada pengguna, sekaligus menghemat usaha administratif yang tidak sepele. 24.2. Global State Variabel global tidak bermain dengan baik dengan perpustakaan. Perpustakaan mungkin dimuat beberapa kali dalam proses, namun hanya ada satu set variabel global. Gambar 24.1 menunjukkan perpustakaan OslashMQ yang digunakan dari dua perpustakaan yang berbeda dan independen. Aplikasi tersebut kemudian menggunakan kedua perpustakaan tersebut. Gambar 24.1: OslashMQ digunakan oleh perpustakaan yang berbeda Ketika situasi seperti ini terjadi, kedua contoh OslashMQ mengakses variabel yang sama, mengakibatkan kondisi balapan, kegagalan aneh dan perilaku yang tidak terdefinisi. Untuk mencegah masalah ini, perpustakaan OslashMQ tidak memiliki variabel global. Sebagai gantinya, pengguna perpustakaan bertanggung jawab untuk menciptakan negara secara eksplisit secara eksplisit. Objek yang berisi keadaan global disebut konteks. Sementara dari konteks perspektif pengguna terlihat lebih atau kurang seperti kumpulan benang pekerja, dari perspektif OslashMQs, hanya sebuah objek untuk menyimpan keadaan global yang mungkin kita butuhkan. Pada gambar di atas, libA akan memiliki konteksnya sendiri dan libB akan memiliki sendiri juga. Tidak ada jalan bagi salah satu dari mereka untuk mematahkan atau menumbangkan yang lain. Pelajaran di sini cukup jelas: Jangan gunakan negara global di perpustakaan. Jika Anda melakukannya, perpustakaan kemungkinan akan rusak saat hal itu terjadi untuk diinisiasi dua kali dalam proses yang sama. 24.3. Kinerja Saat OslashMQ dimulai, tujuan utamanya adalah untuk mengoptimalkan kinerja. Kinerja sistem pesan diekspresikan dengan menggunakan dua metrik: throughputmdashhow banyak pesan dapat dilewatkan selama waktu dan latencymdashhow yang lama membutuhkan pesan dari satu ujung ke ujung yang lain. Metrik mana yang harus kita fokuskan pada Whats hubungan antara keduanya Isnt it looks Run the test, bagi keseluruhan waktu tes dengan jumlah pesan yang disampaikan dan yang Anda dapatkan adalah latency. Bagi jumlah pesan berdasarkan waktu dan apa yang Anda dapatkan adalah throughput. Dengan kata lain, latency adalah nilai invers dari throughput. Trivial, right Alih-alih memulai coding langsung, kami menghabiskan beberapa minggu untuk menyelidiki metrik kinerja secara rinci dan kami menemukan bahwa hubungan antara throughput dan latency jauh lebih halus dari itu, dan seringkali metriknya cukup kontra-intuitif. Bayangkan sebuah pengiriman pesan ke B. (Lihat Gambar 24.2.) Keseluruhan waktu ujian adalah 6 detik. Ada 5 pesan yang lewat. Oleh karena itu throughput adalah 0.83 msgssec (56) dan latencynya adalah 1,2 detik (65), right. Lihat diagramnya lagi. Dibutuhkan waktu yang berbeda untuk setiap pesan untuk mendapatkan dari A ke B: 2 detik, 2,5 detik, 3 detik, 3,5 detik, 4 detik. Rata-rata adalah 3 detik, yang cukup jauh dari perhitungan awal kami 1,2 detik. Contoh ini menunjukkan kesalahpahaman yang secara intuitif cenderung dibuat tentang metrik kinerja. Sekarang kita lihat throughputnya. Waktu keseluruhan tes adalah 6 detik. Namun, di A dibutuhkan hanya 2 detik untuk mengirim semua pesan. Dari As perspective throughputnya adalah 2,5 msgssec (52). Di B dibutuhkan 4 detik untuk menerima semua pesan. Jadi dari perspektif Bs, throughputnya adalah 1.25 msgssec (54). Tak satu pun dari angka-angka ini sesuai dengan perhitungan asli kami dari 1.2 msgssec. Untuk membuat cerita panjang pendek, latency dan throughput adalah dua metrik yang berbeda yang sudah jelas. Yang penting adalah memahami perbedaan antara keduanya dan hubungan timbal balik mereka. Latency hanya bisa diukur antara dua titik yang berbeda dalam sistem. Tidak ada yang namanya latensi pada titik A. Setiap pesan memiliki latensi tersendiri. Anda dapat rata-rata latency dari beberapa pesan Namun, tidak ada yang namanya latency dari aliran pesan. Throughput, di sisi lain, hanya bisa diukur pada satu titik sistem. Ada sebuah throughput pada pengirim, ada sebuah throughput pada receiver, ada sebuah throughput pada titik perantara antara keduanya, tapi tidak ada yang namanya keseluruhan throughput keseluruhan sistem. Dan throughput masuk akal hanya untuk satu set pesan, tidak ada yang namanya throughput dari satu pesan. Sedangkan untuk hubungan antara throughput dan latency, ternyata memang benar ada hubungan namun, rumusnya melibatkan integral dan kita tidak akan membahasnya disini. Untuk informasi lebih lanjut, baca literatur tentang teori antrian. Ada banyak lagi perangkap dalam pembandingan sistem perpesanan yang tidak kita masuki lebih jauh lagi. Stres sebaiknya ditempatkan pada pelajaran yang dipetik: Pastikan Anda memahami masalah yang sedang Anda selesaikan. Bahkan masalah sesederhana membuatnya cepat bisa membawa banyak pekerjaan untuk mengerti dengan benar. Terlebih lagi, jika Anda tidak mengerti masalahnya, kemungkinan besar Anda akan membangun asumsi implisit dan mitos populer dalam kode Anda, membuat solusi menjadi cacat atau setidaknya jauh lebih rumit atau kurang berguna daripada yang seharusnya. 24.4. Jalur Kritis Kami menemukan selama proses pengoptimalan bahwa tiga faktor memiliki dampak penting pada kinerja: Jumlah alokasi memori Jumlah panggilan sistem Model concurrency Namun, tidak setiap alokasi memori atau setiap panggilan sistem memiliki efek yang sama terhadap kinerja. Kinerja yang kami minati dalam sistem pesan adalah jumlah pesan yang dapat kami transfer antara dua titik akhir selama jumlah waktu tertentu. Sebagai alternatif, kita mungkin tertarik pada berapa lama waktu yang dibutuhkan untuk mendapatkan sebuah pesan dari satu titik akhir ke titik akhir yang lain. Namun, mengingat bahwa OslashMQ dirancang untuk skenario dengan koneksi berumur panjang, waktu yang dibutuhkan untuk menjalin koneksi atau waktu yang dibutuhkan untuk menangani kesalahan koneksi pada dasarnya tidak relevan. Peristiwa ini sangat jarang terjadi dan dampaknya terhadap kinerja secara keseluruhan dapat diabaikan. Bagian dari basis kode yang sering digunakan, berulang-ulang, disebut pengoptimalan jalur kritis harus berfokus pada jalur kritis. Mari kita lihat sebuah contoh: OslashMQ tidak terlalu dioptimalkan sehubungan dengan alokasi memori. Misalnya, saat memanipulasi string, ia sering mengalokasikan string baru untuk setiap fase transisi. Namun, jika kita benar-benar melihat jalur kritis mengikuti pesan aktual yang lewat, cobalah cari tahu bahwa hampir tidak ada alokasi memori. Jika pesan kecil, hanya satu alokasi memori per 256 pesan (pesan ini dipegang dalam satu memori besar yang dialokasikan). Jika, selain itu, aliran pesan stabil, tanpa puncak lalu lintas yang besar, jumlah alokasi memori pada jalur kritis turun menjadi nol (potongan memori yang dialokasikan tidak dikembalikan ke sistem, namun digunakan kembali berulang-ulang) . Hal yang dipelajari: mengoptimalkan di mana hal itu membuat perbedaan. Mengoptimalkan potongan kode yang tidak berada pada jalur kritis adalah usaha terbuang sia-sia. 24.5. Mengalokasikan Memori Dengan asumsi bahwa semua infrastruktur diinisialisasi dan hubungan antara dua titik akhir telah ditetapkan, hanya ada satu hal yang harus dialokasikan saat mengirim pesan: pesan itu sendiri. Dengan demikian, untuk mengoptimalkan jalur kritis kita harus melihat bagaimana pesan dialokasikan dan melewati tumpukan turun. Pengetahuan umumnya di bidang jaringan berkinerja tinggi bahwa kinerja terbaik dicapai dengan menyeimbangkan biaya alokasi pesan dengan hati-hati dan biaya penyalinan pesan (misalnya, hal.inria.frdocs00292831PDFOpen-MX-IOAT.pdf. Melihat penanganan yang berbeda dari Pesan kecil, menengah dan besar). Untuk pesan kecil, penyalinan jauh lebih murah daripada mengalokasikan memori. Masuk akal untuk tidak mengalokasikan potongan memori baru sama sekali dan sebagai gantinya menyalin pesan ke memori yang sudah ada sebelumnya bila diperlukan. Untuk pesan besar, di sisi lain, penyalinan jauh lebih mahal daripada alokasi memori. Masuk akal untuk mengalokasikan pesan sekali dan melewati sebuah pointer ke blok yang dialokasikan, alih-alih menyalin data. Pendekatan ini disebut zero-copy. OslashMQ menangani kedua kasus secara transparan. Pesan OslashMQ ditunjukkan oleh gagang buram. Isi pesan yang sangat kecil dikodekan secara langsung di pegangan. Jadi membuat salinan pegangan benar-benar menyalin data pesan. Bila pesan lebih besar, yang dialokasikan dalam buffer terpisah dan pegangan hanya berisi pointer ke buffer. Membuat salinan pegangan tidak menghasilkan penyalinan data pesan, yang masuk akal saat pesannya megabyte panjang (Gambar 24.3). Perlu dicatat bahwa dalam kasus terakhir buffer dihitung referensi sehingga dapat direferensikan oleh beberapa pegangan tanpa perlu menyalin data. Hal yang dipelajari: Saat memikirkan kinerja, jangan anggap ada satu solusi terbaik. Mungkin terjadi bahwa ada beberapa subclass dari masalah (misalnya pesan kecil vs. pesan besar), masing-masing memiliki algoritma optimalnya sendiri. 24.6. Batching Telah disebutkan bahwa banyaknya jumlah panggilan sistem dalam sistem pesan dapat menyebabkan bottleneck kinerja. Sebenarnya, masalahnya jauh lebih generik dari itu. Theres sebuah hukuman kinerja non-sepele terkait dengan melintasi stack panggilan dan dengan demikian, ketika membuat aplikasi berkinerja tinggi, bijaksana untuk menghindari tumpukan sebanyak mungkin melintasi. Pertimbangkan Gambar 24.4. Untuk mengirim empat pesan, Anda harus melintasi keseluruhan tumpukan jaringan empat kali (yaitu OslashMQ, glibc, batas ruang userkernel, implementasi TCP, implementasi IP, lapisan Ethernet, NIC itu sendiri dan kembali menumpuk lagi). Namun, jika Anda memutuskan untuk bergabung dengan pesan tersebut ke dalam satu batch, hanya ada satu traversal stack (Gambar 24.5). Dampak pada throughput pesan bisa sangat banyak: sampai dua urutan besarnya, terutama jika pesannya kecil dan ratusan di antaranya dapat dikemas dalam satu batch. Di sisi lain, batching dapat memiliki dampak negatif pada latency. Mari kita ambil, misalnya, algoritma Nagles yang terkenal, seperti yang diterapkan pada TCP. Ini menunda pesan keluar untuk jangka waktu tertentu dan menggabungkan semua data akumulasi ke dalam satu paket. Jelas, latensi end-to-end dari pesan pertama dalam paket jauh lebih buruk daripada latency yang terakhir. Jadi, yang umum untuk aplikasi yang membutuhkan latency rendah secara konsisten untuk mematikan algoritma Nagles. Ini bahkan umum untuk mematikan batching pada semua tingkat tumpukan (misalnya fitur penggabungan NIC interrupt). Tapi sekali lagi, tidak ada batching berarti traversing tumpukan yang luas dan menghasilkan throughput pesan rendah. Tampaknya kita terjebak dalam dilema throughput versus latency. OslashMQ mencoba untuk memberikan latency rendah secara konsisten dikombinasikan dengan throughput yang tinggi dengan menggunakan strategi berikut: ketika aliran pesan jarang dan tidak melebihi bandwidth tumpukan jaringan, OslashMQ mengubah semua rangkaian untuk meningkatkan latency. Trade-off di sini agak lebih tinggi CPU usagemdashwe masih harus melintasi tumpukan sering. Namun, itu tidak dianggap sebagai masalah dalam banyak kasus. Bila tingkat pesan melebihi bandwidth dari tumpukan jaringan, pesan harus dinyalakan dimodernisasi dalam memori sampai tumpukan siap untuk menerimanya. Antrian berarti latency akan tumbuh. Jika pesan menghabiskan satu detik di antrean, latensi end-to-end akan setidaknya satu detik. Yang lebih parah lagi, seiring bertambahnya ukuran antrian, latensi akan meningkat secara bertahap. Jika ukuran antrian tidak terikat, latency bisa melebihi batas apapun. Telah diamati bahwa meskipun tumpukan jaringan disetel untuk kemungkinan latensi paling rendah (algoritma Nagles dimatikan, penyatuan interupsi NIC dimatikan, dll.) Latency masih bisa suram karena efek antrian, seperti dijelaskan di atas. Dalam situasi seperti itu, masuk akal untuk mulai melakukan batching secara agresif. Tidak ada yang bisa hilang karena latencynya sudah tinggi pula. Di sisi lain, batching agresif meningkatkan throughput dan dapat mengosongkan antrian pesan yang tertundamulai yang pada gilirannya berarti latency secara bertahap akan menurun saat penundaan antrian menurun. Setelah tidak ada pesan yang beredar dalam antrian, batching dapat dimatikan untuk memperbaiki latensi lebih jauh. Satu pengamatan tambahan adalah bahwa penggilingan hanya boleh dilakukan pada tingkat paling atas. Jika pesan dipanggang di sana, lapisan bawah tidak memiliki batch, jadi semua algoritma batching di bawah tidak melakukan apapun kecuali mengenalkan latensi tambahan. Hal yang dipelajari: Untuk mendapatkan throughput optimal dikombinasikan dengan waktu respons optimal dalam sistem asinkron, matikan semua algoritma batching pada lapisan rendah tumpukan dan batch pada tingkat paling atas. Batch hanya saat data baru tiba lebih cepat dari yang bisa diolah. 24.7. Ikhtisar Arsitektur Sampai saat ini kami telah berfokus pada prinsip-prinsip generik yang membuat OslashMQ cepat. Mulai sekarang kita lihat arsitektur sebenarnya dari sistem (Gambar 24.6). Pengguna berinteraksi dengan OslashMQ menggunakan soket yang disebut. Mereka sangat mirip dengan soket TCP, perbedaan utamanya adalah karena masing-masing soket dapat menangani komunikasi dengan beberapa rekan kerja, sedikit seperti soket UDP yang tidak terikat. Objek soket tinggal di thread pengguna (lihat pembahasan model threading di bagian selanjutnya). Selain itu, OslashMQ menjalankan banyak benang kerja yang menangani bagian komunikasi asinkron: membaca data dari jaringan, memberi pesan, menerima koneksi masuk, dll. Ada berbagai objek yang ada di thread pekerja. Masing-masing objek ini dimiliki oleh satu objek induk (kepemilikan dilambangkan dengan garis penuh sederhana dalam diagram). Orang tua bisa tinggal di thread yang berbeda dari pada anak. Sebagian besar benda dimiliki langsung oleh soket namun ada beberapa kasus dimana benda tersebut dimiliki oleh benda yang dimiliki oleh soket tersebut. Yang kita dapatkan adalah sebatang pohon benda, dengan satu pohon per soket. Pohon yang digunakan saat dimatikan tidak ada benda yang dapat menutup dirinya sampai menutup semua anak-anaknya. Dengan cara ini kita dapat memastikan bahwa proses shut down bekerja seperti yang diharapkan misalnya, bahwa pesan outbound yang tertunda didorong ke jaringan sebelum menghentikan proses pengiriman. Secara kasar, ada dua macam objek asinkron ada benda yang tidak dilibatkan dalam pesan yang lewat dan ada benda yang ada. Yang pertama harus dilakukan terutama dengan manajemen koneksi. Sebagai contoh, objek pendengar TCP mendengarkan koneksi TCP yang masuk dan membuat objek mesin untuk setiap koneksi baru. Demikian pula, objek konektor TCP mencoba terhubung ke rekan TCP dan ketika berhasil, ia menciptakan objek penggerak untuk mengatur koneksi. Jika sambungan tersebut gagal, objek konektor mencoba untuk membuatnya kembali. Yang terakhir adalah objek yang menangani transfer data itu sendiri. Objek ini terdiri dari dua bagian: objek sesi bertanggung jawab untuk berinteraksi dengan soket OslashMQ, dan objek mesin bertanggung jawab untuk komunikasi dengan jaringan. Hanya ada satu jenis objek sesi, namun ada jenis mesin yang berbeda untuk masing-masing protokol yang mendasari dukungan OslashMQ. Thus, we have TCP engines, IPC (inter-process communication) engines, PGM engines (a reliable multicast protocol, see RFC 3208), etc. The set of engines is extensiblemdashin the future we may choose to implement, say, a WebSocket engine or an SCTP engine. The sessions are exchanging messages with the sockets. There are two directions to pass messages in and each direction is handled by a pipe object. Each pipe is basically a lock-free queue optimized for fast passing of messages between threads. Finally, theres a context object (discussed in the previous sections but not shown on the diagram) that holds the global state and is accessible by all the sockets and all the asynchronous objects. 24.8. Concurrency Model One of the requirements for OslashMQ was to take advantage of multi-core boxes in other words, to scale the throughput linearly with the number of available CPU cores. Our previous experience with messaging systems showed that using multiple threads in a classic way (critical sections, semaphores, etc.) doesnt yield much performance improvement. In fact, a multi-threaded version of a messaging system can be slower than a single-threaded one, even if measured on a multi-core box. Individual threads are simply spending too much time waiting for each other while, at the same time, eliciting a lot of context switching that slows the system down. Given these problems, weve decided to go for a different model. The goal was to avoid locking entirely and let each thread run at full speed. The communication between threads was to be provided via asynchronous messages (events) passed between the threads. This, as insiders know, is the classic actor model . The idea was to launch one worker thread per CPU coremdashhaving two threads sharing the same core would only mean a lot of context switching for no particular advantage. Each internal OslashMQ object, such as say, a TCP engine, would be tightly bound to a particular worker thread. That, in turn, means that theres no need for critical sections, mutexes, semaphores and the like. Additionally, these OslashMQ objects wont be migrated between CPU cores so would thus avoid the negative performance impact of cache pollution (Figure 24.7 ). This design makes a lot of traditional multi-threading problems disappear. Nevertheless, theres a need to share the worker thread among many objects, which in turn means there has to be some kind of cooperative multitasking. This means we need a scheduler objects need to be event-driven rather than being in control of the entire event loop we have to take care of arbitrary sequences of events, even very rare ones we have to make sure that no object holds the CPU for too long etc. In short, the whole system has to become fully asynchronous. No object can afford to do a blocking operation, because it would not only block itself but also all the other objects sharing the same worker thread. All objects have to become, whether explicitly or implicitly, state machines. With hundreds or thousands of state machines running in parallel you have to take care of all the possible interactions between them andmdashmost importantlymdashof the shutdown process. It turns out that shutting down a fully asynchronous system in a clean way is a dauntingly complex task. Trying to shut down a thousand moving parts, some of them working, some idle, some in the process of being initiated, some of them already shutting down by themselves, is prone to all kinds of race conditions, resource leaks and similar. The shutdown subsystem is definitely the most complex part of OslashMQ. A quick check of the bug tracker indicates that some 30--50 of reported bugs are related to shutdown in one way or another. Lesson learned: When striving for extreme performance and scalability, consider the actor model its almost the only game in town in such cases. However, if you are not using a specialised system like Erlang or OslashMQ itself, youll have to write and debug a lot of infrastructure by hand. Additionally, think, from the very beginning, about the procedure to shut down the system. Its going to be the most complex part of the codebase and if you have no clear idea how to implement it, you should probably reconsider using the actor model in the first place. 24.9. Lock-Free Algorithms Lock-free algorithms have been in vogue lately. They are simple mechanisms for inter-thread communication that dont rely on the kernel-provided synchronisation primitives, such as mutexes or semaphores rather, they do the synchronisation using atomic CPU operations, such as atomic compare-and-swap (CAS). It should be understood that they are not literally lock-freemdashinstead, locking is done behind the scenes on the hardware level. OslashMQ uses a lock-free queue in pipe objects to pass messages between the users threads and OslashMQs worker threads. There are two interesting aspects to how OslashMQ uses the lock-free queue. First, each queue has exactly one writer thread and exactly one reader thread. If theres a need for 1-to- N communication, multiple queues are created (Figure 24.8 ). Given that this way the queue doesnt have to take care of synchronising the writers (theres only one writer) or readers (theres only one reader) it can be implemented in an extra-efficient way. Second, we realised that while lock-free algorithms were more efficient than classic mutex-based algorithms, atomic CPU operations are still rather expensive (especially when theres contention between CPU cores) and doing an atomic operation for each message written andor each message read was slower than we were willing to accept. The way to speed it upmdashonce againmdashwas batching. Imagine you had 10 messages to be written to the queue. It can happen, for example, when you received a network packet containing 10 small messages. Receiving a packet is an atomic event you cannot get half of it. This atomic event results in the need to write 10 messages to the lock-free queue. Theres not much point in doing an atomic operation for each message. Instead, you can accumulate the messages in a pre-write portion of the queue thats accessed solely by the writer thread, and then flush it using a single atomic operation. The same applies to reading from the queue. Imagine the 10 messages above were already flushed to the queue. The reader thread can extract each message from the queue using an atomic operation. However, its overkill instead, it can move all the pending messages to a pre-read portion of the queue using a single atomic operation. Afterwards, it can retrieve the messages from the pre-read buffer one by one. Pre-read is owned and accessed solely by the reader thread and thus no synchronisation whatsoever is needed in that phase. The arrow on the left of Figure 24.9 shows how the pre-write buffer can be flushed to the queue simply by modifying a single pointer. The arrow on the right shows how the whole content of the queue can be shifted to the pre-read by doing nothing but modifying another pointer. Lesson learned: Lock-free algorithms are hard to invent, troublesome to implement and almost impossible to debug. If at all possible, use an existing proven algorithm rather than inventing your own. When extreme performance is required, dont rely solely on lock-free algorithms. While they are fast, the performance can be significantly improved by doing smart batching on top of them. 24.10. API The user interface is the most important part of any product. Its the only part of your program visible to the outside world and if you get it wrong the world will hate you. In end-user products its either the GUI or the command line interface. In libraries its the API. In early versions of OslashMQ the API was based on AMQPs model of exchanges and queues. (See the AMQP specification .) From a historical perspective its interesting to have a look at the white paper from 2007 that tries to reconcile AMQP with a brokerless model of messaging. I spent the end of 2009 rewriting it almost from scratch to use the BSD Socket API instead. That was the turning point OslashMQ adoption soared from that point on. While before it was a niche product used by a bunch of messaging experts, afterwards it became a handy commonplace tool for anybody. In a year or so the size of the community increased tenfold, some 20 bindings to different languages were implemented, etc. The user interface defines the perception of a product. With basically no change to the functionalitymdashjust by changing the APImdashOslashMQ changed from an enterprise messaging product to a networking product. In other words, the perception changed from a complex piece of infrastructure for big banks to hey, this helps me to send my 10-byte-long message from application A to application B. Lesson learned: Understand what you want your project to be and design the user interface accordingly. Having a user interface that doesnt align with the vision of the project is a 100 guaranteed way to fail. One of the important aspects of the move to the BSD Sockets API was that it wasnt a revolutionary freshly invented API, but an existing and well-known one. Actually, the BSD Sockets API is one of the oldest APIs still in active use today it dates back to 1983 and 4.2BSD Unix. Its been widely used and stable for literally decades. The above fact brings a lot of advantages. Firstly, its an API that everybody knows, so the learning curve is ludicrously flat. Even if youve never heard of OslashMQ, you can build your first application in couple of minutes thanks to the fact that you are able to reuse your BSD Sockets knowledge. Secondly, using a widely implemented API enables integration of OslashMQ with existing technologies. For example, exposing OslashMQ objects as sockets or file descriptors allows for processing TCP, UDP, pipe, file and OslashMQ events in the same event loop. Another example: the experimental project to bring OslashMQ-like functionality to the Linux kernel turned out to be pretty simple to implement. By sharing the same conceptual framework it can re-use a lot of infrastructure already in place. Thirdly and probably most importantly, the fact that the BSD Sockets API survived almost three decades despite numerous attempts to replace it means that there is something inherently right in the design. BSD Sockets API designers havemdashwhether deliberately or by chancemdashmade the right design decisions. By adopting the API we can automatically share those design decisions without even knowing what they were and what problem they were solving. Lesson learned: While code reuse has been promoted from time immemorial and pattern reuse joined in later on, its important to think of reuse in an even more generic way. When designing a product, have a look at similar products. Check which have failed and which have succeeded learn from the successful projects. Dont succumb to Not Invented Here syndrome. Reuse the ideas, the APIs, the conceptual frameworks, whatever you find appropriate. By doing so you are allowing users to reuse their existing knowledge. At the same time you may be avoiding technical pitfalls you are not even aware of at the moment. 24.11. Messaging Patterns In any messaging system, the most important design problem is that of how to provide a way for the user to specify which messages are routed to which destinations. There are two main approaches, and I believe this dichotomy is quite generic and applicable to basically any problem encountered in the domain of software. One approach is to adopt the Unix philosophy of do one thing and do it well. What this means is that the problem domain should be artificially restricted to a small and well-understood area. The program should then solve this restricted problem in a correct and exhaustive way. An example of such approach in the messaging area is MQTT. Its a protocol for distributing messages to a set of consumers. It cant be used for anything else (say for RPC) but it is easy to use and does message distribution well. The other approach is to focus on generality and provide a powerful and highly configurable system. AMQP is an example of such a system. Its model of queues and exchanges provides the user with the means to programmatically define almost any routing algorithm they can think of. The trade-off, of course, is a lot of options to take care of. OslashMQ opts for the former model because it allows the resulting product to be used by basically anyone, while the generic model requires messaging experts to use it. To demonstrate the point, lets have a look how the model affects the complexity of the API. What follows is implementation of RPC client on top of a generic system (AMQP): On the other hand, OslashMQ splits the messaging landscape into so-called messaging patterns. Examples of the patterns are publishsubscribe, requestreply or parallelised pipeline. Each messaging pattern is completely orthogonal to other patterns and can be thought of as a separate tool. What follows is the re-implementation of the above application using OslashMQs requestreply pattern. Note how all the option tweaking is reduced to the single step of choosing the right messaging pattern ( REQ ): Up to this point weve argued that specific solutions are better than generic solutions. We want our solution to be as specific as possible. However, at the same time we want to provide our customers with as wide a range of functionality as possible. How can we solve this apparent contradiction The answer consists of two steps: Define a layer of the stack to deal with a particular problem area (e.g. transport, routing, presentation, etc.). Provide multiple implementations of the layer. There should be a separate non-intersecting implementation for each use case. Lets have a look at the example of the transport layer in the Internet stack. Its meant to provide services such as transferring data streams, applying flow control, providing reliability, etc. on the top of the network layer (IP). It does so by defining multiple non-intersecting solutions: TCP for connection-oriented reliable stream transfer, UDP for connectionless unreliable packet transfer, SCTP for transfer of multiple streams, DCCP for unreliable connections and so on. Note that each implementation is completely orthogonal: a UDP endpoint cannot speak to a TCP endpoint. Neither can a SCTP endpoint speak to a DCCP endpoint. It means that new implementations can be added to the stack at any moment without affecting the existing portions of the stack. Conversely, failed implementations can be forgotten and discarded without compromising the viability of the transport layer as a whole. The same principle applies to messaging patterns as defined by OslashMQ. Messaging patterns form a layer (the so-called scalability layer) on top of the transport layer (TCP and friends). Individual messaging patterns are implementations of this layer. They are strictly orthogonalmdashthe publishsubscribe endpoint cant speak to the requestreply endpoint, etc. Strict separation between the patterns in turn means that new patterns can be added as needed and that failed experiments with new patterns wont hurt the existing patterns. Lesson learned: When solving a complex and multi-faceted problem it may turn out that a monolithic general-purpose solution may not be the best way to go. Instead, we can think of the problem area as an abstract layer and provide multiple implementations of this layer, each focused on a specific well-defined use case. When doing so, delineate the use case carefully. Be sure about what is in the scope and what is not. By restricting the use case too aggressively the application of your software may be limited. If you define the problem too broadly, however, the product may become too complex, blurry and confusing for the users. 24.12. Conclusion As our world becomes populated with lots of small computers connected via the Internetmdashmobile phones, RFID readers, tablets and laptops, GPS devices, etc.mdashthe problem of distributed computing ceases to be the domain of academic science and becomes a common everyday problem for every developer to tackle. The solutions, unfortunately, are mostly domain-specific hacks. This article summarises our experience with building a large-scale distributed system in a systematic manner. It focuses on problems that are interesting from a software architecture point of view, and we hope that designers and programmers in the open source community will find it useful. Back to top Back to The Architecture of Open Source Applications .
Forex-trading-strategien-und-methodenstreit
Free-forex-trading-software-for-mac