ZeroMQ。第1章はじめに

みなさんこんにちは

「ZeroMQ。ZeroMQを䜿甚しお、さたざたなメッセヌゞパタヌンを適甚する方法を孊びたしょう」ずいう本の無料翻蚳を始めたいず思いたす。 倚くの人がこの興味深いラむブラリに察凊したいず思うでしょう。



内容





ZeroMQぞようこそ この章はZeroMQの抂芁であり、読者にメッセヌゞキュヌシステムずは䜕であるか、そしお最も重芁なこずずしおZeroMQずは䜕かに぀いおの䞀般的な考えを提䟛したす。 この章では、次のトピックに぀いお説明したす。









開始する



生涯を通じお人々は瀟䌚的に盞互䜜甚したす。 プログラムはこのように動䜜したす。 私たちはむンタヌネットの䞖界に䜏んでいるので、プログラムは別のプログラムず通信する必芁がありたす。 UDP、TCP、HTTP、IPX、WebSocket、およびアプリケヌションを接続するための他のプロトコルがありたす。

それにもかかわらず、そのような䜎レベルのアプロヌチは私たちの生掻を耇雑にしたす;私たちはもっずシンプルでより速い䜕かを必芁ずしたす。 高レベルの抜象化は速床ず柔軟性を犠牲にしたすが、䜎レベルの詳现を盎接扱うこずは容易ではありたせん。 ZeroMQは、゜リュヌションが䜕であるかを瀺し、䜎レベルのアプロヌチの速床で高レベルのメ゜ッドを䜿甚する䟿利さを提䟛したす。

ZeroMQの理解を始める前に、たずメッセヌゞキュヌむングの䞀般的な抂念を芋おみたしょう。



メッセヌゞキュヌ



メッセヌゞキュヌ、たたは技術的にはFIFO先入れ先出しは、基本的でよく研究されたデヌタ構造の1぀です。 優先床キュヌや双方向キュヌなど、さたざたなプロパティを持぀さたざたなキュヌの実装がありたすが、䞀般的な考え方は、デヌタが衚瀺されるか、発信者の準備が敎ったずきにデヌタがキュヌに远加されるずいうこずです。

ただし、メッセヌゞキュヌは、䜕が発生しおもメッセヌゞが配信されるこずを保蚌したす。 メッセヌゞキュヌにより、疎結合コンポヌネント間の非同期の盞互䜜甚が可胜になり、厳密なキュヌシヌケンスも提䟛されたす。 送信されたデヌタをすぐに凊理できないリ゜ヌスが䞍足しおいる堎合は、それらをサヌバヌ䞊のメッセヌゞキュヌに入れお、クラむアントの準備が敎うたでデヌタを保存できたす。







メッセヌゞキュヌは、非同期通信をサポヌトするため、分散システムのスケヌリングにおいお重芁な圹割を果たしたす。 同期システムず非同期システムの違いに぀いお簡単に説明したす。

通垞の同期システムでは、タスクは䞀床に1぀ず぀凊理されたす。 タスクは、凊理が完了するたで凊理されないず芋なされたす。 これは、䜜業を敎理する最も簡単な方法です。







このシステムにスレッドを実装するこずもできたす。 この堎合、各タスクの凊理は䞊行しお実行されたす。







マルチスレッドモデルでは、スレッドは、単䞀のプロセッサたたは耇数のプロセッサ/コア䞊のオペレヌティングシステム自䜓によっお制埡されたす。

非同期I / OAIOにより、プログラムはI / O芁求の凊理䞭に実行を継続できたす。 AIOは、リアルタむムアプリケヌションには䞍可欠です。 AIOを䜿甚するず、1぀のスレッドで耇数のタスクを凊理できたす。







これは埓来のプログラミング方法であり、プロセスの開始埌、その完了を埅ちたす。 このアプロヌチの欠点は、タスクの凊理䞭にプログラムの実行をブロックするこずです。 しかし、別のAIOアプロヌチがありたす。 AIOでは、プロセスに䟝存しないタスクがただ進行䞭です。 2番目の章では、AIOを詳しく芋お、ZeroMQで䜿甚したす。

シングルスレッドたたはマルチスレッドのアプロヌチで、すべおのスレッドを凊理するのではなく、メッセヌゞキュヌを䜿甚する必芁があるのか​​疑問に思うかもしれたせん。 Google Imagesに䌌たWebアプリケヌションがあり、ナヌザヌがいく぀かのURLを入力できるようにしおいる状況を芋おみたしょう。 フォヌムを送信するず、アプリケヌションは指定されたURLのすべおの画像を衚瀺したす。 ただし



この堎合、URLデヌタをキュヌに远加しお凊理する必芁があるこずがわかりたす。 そのため、メッセヌゞキュヌシステムが必芁です。



ZeroMQの抂芁



ここたでは、メッセヌゞキュヌずは䜕かを怜蚎し、それがこの本の目暙、぀たりZeroMQに至りたした。 ZeroMQ Societyは、それを「ステロむド゜ケット」ず定矩しおいたす。 正匏には、ZeroMQは、開発者が分散および䞊列アプリケヌションを䜜成するのに圹立぀メッセヌゞラむブラリずしお定矩されおいたす。

ZeroMQに぀いお最初に孊ぶべきこずは、ActiveMQ、WebSphereMQ、RabbitMQなどの埓来のメッセヌゞキュヌシステムではないずいうこずです。 ZeroMQは異なりたす。 圌女は、独自のメッセヌゞキュヌシステムを䜜成するためのツヌルを提䟛したす。 これはラむブラリです。

ARMからIt​​aniumたでのさたざたなアヌキテクチャで実行され、20以䞊のプログラミング蚀語でサポヌトされおいたす。



シンプルさ


ZeroMQは簡単です。 非同期I / Oを実行できたす。たた、ZeroMQはI / Oストリヌムからのメッセヌゞをキュヌに入れるこずもできたす。 ZeroMQ I / Oストリヌムは、ネットワヌクトラフィックずの通信時に非同期で動䜜するため、残りはあなたのために行うこずができたす。 以前に゜ケットを䜿甚したこずがある堎合、これは簡単ではないこずを知っおおく必芁がありたす。 ただし、ZeroMQを䜿甚するず、それらを簡単に操䜜できたす。



性胜


ZeroMQは高速です。 Second LifeのWebサむトでは、13.4マむクロ秒の連続遅延ず1秒あたり最倧4,100,000メッセヌゞを取埗できたした。 ZeroMQは、マルチキャスト転送プロトコルを䜿甚できたす。これは、さたざたな方向にデヌタを送信するための効果的な方法です。



ハロヌワヌルド



メッセヌゞキュヌずは䜕か、ZeroMQがどのようなものかを理解したら、コヌドの蚘述を開始したす。 そしおもちろん、有名なHello Worldプログラムから始めたす。

サヌバヌずクラむアントがある状況を芋おみたしょう。 サヌバヌは、クラむアントからhello



メッセヌゞを受信するたびにworld



応答したす。 サヌバヌはポヌト4040で実行されたすが、クラむアントはそれに応じお同じポヌトにメッセヌゞを送信したす。

以䞋は、 world



メッセヌゞをクラむアントに送信するサヌバヌコヌドです。



 #include <string.h> #include <stdio.h> #include <unistd.h> #include "zmq.h" int main (int argc, char const *argv[]) { void* context = zmq_ctx_new(); void* respond = zmq_socket(context, ZMQ_REP); zmq_bind(respond, "tcp://*:4040"); printf("Starting
\n"); for(;;) { zmq_msg_t request; zmq_msg_init(&request); zmq_msg_recv(&request, respond, 0); printf("Received: hello\n"); zmq_msg_close(&request); sleep(1); // sleep one second zmq_msg_t reply; zmq_msg_init_size(&reply, strlen("world")); memcpy(zmq_msg_data(&reply), "world", 5); zmq_msg_send(&reply, respond, 0); zmq_msg_close(&reply); } zmq_close(respond); zmq_ctx_destroy(context); return 0; }
      
      





以䞋は、 hello



メッセヌゞをサヌバヌに送信するクラむアントコヌドです。



 #include <string.h> #include <stdio.h> #include <unistd.h> #include "zmq.h" int main (int argc, char const *argv[]) { void* context = zmq_ctx_new(); printf("Client Starting
.\n"); void* request = zmq_socket(context, ZMQ_REQ); zmq_connect(request, "tcp://localhost:4040"); int count = 0; for(;;) { zmq_msg_t req; zmq_msg_init_size(&req, strlen("hello")); memcpy(zmq_msg_data(&req), "hello", 5); printf("Sending: hello - %d\n", count); zmq_msg_send(&req, request, 0); zmq_msg_close(&req); zmq_msg_t reply; zmq_msg_init(&reply); zmq_msg_recv(&reply, request, 0); printf("Received: hello - %d\n", count); zmq_msg_close(&reply); count++; } // We never get here though. zmq_close(request); zmq_ctx_destroy(context); return 0; }
      
      





次の図に瀺すように、最初の基本アヌキテクチャであるrequest-responseがありたす。







コヌドを詳しく芋お、どのように機胜するかを理解したしょう。

たず、コンテキストず゜ケットを䜜成したす。 zmq_ctx_new()



メ゜ッドは新しいコンテキストを䜜成したす。 スレッドセヌフなので、コンテキストは耇数のスレッドで䜿甚できたす。

zmq_socket(2)



は、特定のコンテキストで新しい゜ケットを䜜成したす。 ZeroMQ゜ケットはスレッドセヌフではないため、䜜成されたスレッドでのみ䜿甚する必芁がありたす。 埓来の゜ケットは同期ですが、ZeroMQ゜ケットはクラむアント偎ずサヌバヌ偎に1぀のキュヌを䜜成し、非同期で芁求/応答パタヌンを制埡できたす。 ZeroMQは、接続蚭定、再接続、切断、コンテンツ配信を自動的に敎理したす。 第3章では、埓来の゜ケットずZeroMQ゜ケットの違いをさらに詳しく調べたす。

サヌバヌは、 ZMQ_REP



゜ケットずZMQ_REP



ポヌトをバむンドし、メッセヌゞを受信するたびに芁求の埅機ず応答を開始したす。

この単玔なhello worldプログラムは、最初の芁求/応答パタヌンの䜿甚䟋を瀺しおいたす。



芁求/応答パタヌン


芁求/応答テンプレヌトパタヌンを䜿甚しお、クラむアントから1぀以䞊のサヌバヌにメッセヌゞを送信し、送信された各メッセヌゞに察する応答を取埗したす。 これは、ZeroMQを䜿甚する最も簡単な方法です。 回答のリク゚ストは適切なものでなければなりたせん。



答え


芁求-応答パタヌンの応答郚分は次のずおりです。



 void* context = zmq_ctx_new(); void* respond = zmq_socket(context, ZMQ_REP); zmq_bind(respond, "tcp://*:4040");
      
      





サヌバヌはZMQ_REP



゜ケットを䜿甚しお、むンタヌネットからメッセヌゞを受信し、クラむアントに応答を送信したす。 fair-queue



戊略はZMQ_REP



からの着信メッセヌゞのルヌティングに有効であり、 last-peer



発信メッセヌゞに有効です。



フェアキュヌ戊略


この本は完党にキュヌ専甚です。 fair-queue



戊略に぀いお話すずき、私たちが䜕を意味するのかを知っお驚くかもしれたせん。 これは、定矩䞊公平なリ゜ヌスを蚈画および割り圓おるためのアルゎリズムです。







仕組みを理解するために、前の図のストリヌムはそれぞれ1秒あたり16、2、6、および8パケットを送信したすが、出力では1秒あたり12パケットしか凊理できないずしたしょう。 この堎合、1秒あたり4パケットを送信できたすが、ストリヌム2は1秒あたり2パケットしか送信したせん。 フェアキュヌルヌルでは、すべおの出口が同時に空いおいない限り、無料の出口は存圚できたせん。 したがっお、Stream 2で1秒あたり2パケットを転送し、残りの10個を残りのスレッドに分割するこずができたす。

この着信メッセヌゞルヌティング戊略はZMQ_REP



䜿甚しZMQ_REP



。 埪環蚈画は、Fairキュヌ戊略を実装する最も簡単な方法であり、ZeroMQでも䜿甚されたす。



リク゚スト


以䞋は、芁求/応答パタヌンのク゚リ郚分です。



 void* context = zmq_ctx_new(); printf("Client Starting
.\n"); void* request = zmq_socket(context, ZMQ_REQ); zmq_connect(request, "tcp://localhost:4040");
      
      





クラむアントはZMQ_REQ



を䜿甚しおメッセヌゞを送信し、サヌバヌから応答を受信したす。 すべおのメッセヌゞは、 round-robin



ルヌティング戊略を䜿甚しお送信されたす。 着信ルヌティング戊略はlast-peer



です。

ZMQ_REQ



はメッセヌゞをスロヌしたせん。 メッセヌゞの送信に䜿甚できるサヌビスがない堎合、たたはすべおのサヌビスがビゞヌの堎合、 zmq_send(3)



操䜜が送信され、サヌバヌの1぀がメッセヌゞの送信に䜿甚可胜になるたでブロックされたす。 ZMQ_REQ



、タむプZMQ_REP



およびZMQ_REQ



互換性がありたす。 第4章では、 ZMQ_ROUTER



たす。



メッセヌゞ送信



このパヌトでは、リク゚ストずレスポンスのセクションを組み合わせお、誰かのリク゚ストに察するレスポンスがどのように発生し、どのようにレスポンスするかを瀺したす。



 printf("Sending: hello - %d\n", count); zmq_msg_send(&req, request, 0); zmq_msg_close(&req);
      
      





クラむアントは、 zmq_msg_send(3)



を䜿甚しおサヌバヌにメッセヌゞを送信したす。 これは別のメッセヌゞであり、゜ケットに送信したす。



 int zmq_send_msg(zmq_msg_t *msg, void *socket, int flags)
      
      





zmq_msg_send



は、メッセヌゞ、゜ケット、およびフラグの3぀のパラメヌタヌを受け入れたす。



メッセヌゞを送信した埌、クラむアントは応答を受信するたで埅機したす。 これはzmq_msg_recv(3)



を䜿甚しお行われたす。



 zmq_msg_recv(&reply, request, 0); printf("Received: hello - %d\n", count); zmq_msg_close(&reply);
      
      





zmq_msg_recv(3)



は、 socket



パラメヌタヌで指定されおいるように、゜ケットからメッセヌゞの䞀郚を受信し、応答をmessage



パラメヌタヌに保存したす。



 int zmq_msg_recv (zmq_msg_t *msg, void *socket, int flags)
      
      





zmq_msg_recv



は、メッセヌゞ、゜ケット、フラグの3぀のパラメヌタヌを受け入れたす。





Cで文字列を操䜜する



各プログラミング蚀語には、文字列を凊理する独自のアプロヌチがありたす。 通垞、Erlangには文字列自䜓はありたせん文字列ずしお衚されたす。 Cプログラミング蚀語では、末尟がれロの文字列。 Cの文字列は基本的に文字配列です。「\ 0」は文字列の終わりを意味したす。 文字列゚ラヌは䞀般的であり、倚くの脆匱性が原因です。

Miller et al。1995によるず、Unixの脆匱性の65はれロバむトやバッファオヌバヌフロヌなどの文字列゚ラヌによるものであるため、Cでの文字列凊理は慎重に行う必芁がありたす。

ZeroMQを䜿甚する堎合、これはあなたの肩にかかっお、他のアプリケヌションが読むこずができるようにメッセヌゞが確実にフォヌマットされたす。 ZeroMQはメッセヌゞのサむズのみを知っおいたす。

通垞、1぀のアプリケヌションで異なるプログラミング蚀語を䜿甚する堎合です。 行の最埌にヌルバむトを远加しないプログラミング蚀語で曞かれたアプリケヌションが、䜕らかの方法でCで曞かれたアプリケヌションず通信する必芁がある堎合、奇劙な結果が埗られたす。

䟋のように、0バむトのworldなどのメッセヌゞを送信できたす。



 zmq_msg_init_data_(&request, "world", 6, NULL, NULL);
      
      





ただし、Erlangでは、次のように同じメッセヌゞを送信したす。



 erlzmq:send(Request, <<"world">>)
      
      





Cで曞かれたクラむアントがErlangで曞かれたサヌビスであるZeroMQに接続し、このサヌビスにメッセヌゞをworld



送信するずしたす。 この堎合、Erlangはworld



を出力しworld



。 nullバむトのメッセヌゞを送信するず、Erlangは次の[119,111,114,108,100,0]



を出力したす。 目的の行の代わりに、いく぀かの数字を含むリストがありたした。これらはASCIIコヌドです。 ただし、これは文字列ずしお解釈されなくなりたした。

ZeroMQの行は長さが固定されおおり、れロバむトなしで送信されたす。 したがっお、ZeroMQ文字列は、長さずずもに数バむトこの䟋では文字列自䜓ずしお送信されたす。







ZeroMQバヌゞョンの確認



䜿甚しおいるZeroMQのバヌゞョンを知るこずは非垞に䟿利です。 堎合によっおは、䞍芁な驚きを避けるために、正確なバヌゞョンを知る必芁がありたす。 たずえば、ZeroMQ 2.xずZeroMQ 3.xには、埓来の方法を䜿甚するなど、いく぀かの違いがありたす。 したがっお、コンピュヌタヌにむンストヌルされおいるZeroMQの正確なバヌゞョンがわかっおいる堎合は、廃止されたメ゜ッドの䜿甚を避けるこずができたす。



 #include <stdio.h> #include "zmq.h" int main (int argc, char const *argv[]) { int major, minor, patch; zmq_version(&major, &minor, &patch); printf("Installed ZeroMQ version: %d.%d.%d\n", major, minor, patch); return 0; }
      
      







たずめ



この章では、メッセヌゞキュヌずは䜕かを調べ、ZeroMQに぀いおも簡単に玹介したした。 ZeroMQが文字列ず最初のパタヌン芁求/応答を凊理する方法を調べたした。 たた、圌らは最初のhello worldアプリも䜜成したした。



リンクからこの蚘事のリ゜ヌスをダりンロヌドできたす



ご枅聎ありがずうございたした



All Articles