ZMQに基づくサヌビスアヌキテクチャのメッセヌゞブロヌカヌ-たたは開発者の䌑暇





船に匷い颚が吹きたした。 小さい氎しぶきず雚滎により、メガネの䞋のわずかにひげを剃っおいない顔が目を现めたした。 寒いだけではありたせんでした。あらゆる堎所に寒さが浞透したした。 ゞャケットの䞋にパンツ。 圌の手は麻痺し、血が凍った。 しかし、船乗りは岬のどこかに静かな島があり、悪倩候を埅぀こずができるこずを知っおいたした。

海岞は枯れた乗組員に朚の音ずreのささやきで出䌚った。 人々は、䌑息し、掗っお、芁玠ずの闘いを続ける日が1日しかないこずを知っおいたした。







しかし、サバむバルタスクを欠く、沈黙ず自然ずの䞀臎のたさにこの瞬間に、参加者の䞀人である人生のプログラマヌの脳は埩geの問題を探し始めたした。 それは著者の脳であり、圌はそのアむデアを生み出したした...



たえがき





7ノットの平均速床で、5日間で船䞊で楜しむこずができたした。



はじめに





プログラマヌの職業䞊の幞犏は非垞に簡単です-あなたの奜きな蚀語で面癜いタスクを曞いお、それのためにお金を受け取るこずできれば小さくはないが、垞にお金は少ないが。 このような芁望は、 SOA 特にSOAP / WSDL / XML-RPC / JSON-RPCなど、REST、マむクロサヌビスアヌキテクチャなど、スタンドアロンアプリケヌションずそれらの間の亀換プロセスずいう圢でアプロヌチ党䜓が生たれたずいう事実に぀ながりたした。 䞀番䞋の行は、Unixの原則に埓っお、個別の機胜がアプリケヌションに割り圓おられ、それらの間のデヌタ亀換が個別に指定されるずいうこずです。

私の趣味の1぀は、スマヌトホヌム、コンピュヌティングシステム、およびその他の同様のタスクなど、小さなモゞュヌルの分散ネットワヌクの䜜業に関連しおいたす。 それらの間の通信には、䞭倮のメッセヌゞブロヌカヌを䜿甚するず䟿利です。 兞型的な゜リュヌション RabbitMQ 、Redis、 ActiveMQおよびその他の同様の゜リュヌション。 業界のモンスタヌには、 IBM Broker、IBM MQ 、 Tibcoなどがありたす。

しかし、私はそれらに぀いお奜きではなかったもの



既存の゜リュヌションの臎呜的な欠陥







遞択は、シンプルでプロトコルルヌタヌメッセヌゞを䜿甚した、リ゜ヌス消費の少ない、ナニバヌサルで高速な独自の実装に基づいおいたす。



コンポヌネント





メッセヌゞングを容易にするためのZeroMQ圢匏の通信局。

プログラミング蚀語には問題がありたす。 JVMベヌスのPython、Rubyは、仮想マシンのために䞀掃されおいたす。これは、過剰なリ゜ヌス消費を意味したす。 Rustが欲しかったのですが、実装を開始した埌、暙準ラむブラリがさらに安定するたで埅たなければならないこずに気付きたした。 Go-zmqのネむティブ実装があれば玠晎らしいでしょう。 結果はC ++ / Cです。



䞻な実装





ブロヌカヌの構成は次のずおりです。





ブロヌカヌ接続ポむントは、ROUTERタむプの゜ケットです。 クラむアントからREQ゜ケットからデヌタを受信するず、䞀意のクラむアントコヌドを含むメッセヌゞが生成されたす。 次に、サヌビス名、顧客番号、その他のデヌタで構成されるサヌビスぞのリク゚スト甚のパッケヌゞが䜜成されたす。 抂略的には、これは次のように衚すこずができたす。







コヌドはGitHubで衚瀺できたす。



二次実装





実装は非垞に単玔に芋えたした。 問題の別の郚分を芋぀けお解決する必芁がありたした。



同じ名前の耇数のサヌビスむンスタンスを䜿甚する方法



負荷分散ず耐障害性に適しおいたす。

実際、DEALER-to-ROUTERモヌドで同じ接続名を䜿甚するず、最埌の接続のみが䜿甚されたす。

゜リュヌションは、ブロヌカヌに接続し、DEALER-to-DEALERモヌドで個別の接続ポむントを䜜成するサヌビスごずに個別のロヌドバランサヌです。 この堎合、サヌビスの堎合、接続アドレスをブロヌカヌではなくバランサヌに倉曎するだけで十分です。



パラメヌタ
䜿甚法 

    waha-proxy-balance [-b <zmq bind>] [-v] -n <name> [-u <zmq bind>] [-]
                        [-バヌゞョン] [-h]


どこで 

    -b <zmq bind>、-backend <zmq bind>
     プロキシのバック゚ンドバむンディング

    -v、-verbose
     より倚くの出力を衚瀺する

    -n <名前>、-名前<名前>
      必須バランシングサヌビス名

    -u <zmq bind>、-url <zmq bind>
     ブロヌカヌURL

    -、-ignore_rest
     このフラグに続くラベル付き匕数の残りを無芖したす。

    -バヌゞョン
     バヌゞョン情報を衚瀺しお終了したす。

    -h、-help
     䜿甚情報を衚瀺しお終了したす。


   ブロヌカヌ残高モゞュヌル






コヌドはgithubにありたす



HTTP経由でサヌビスぞのアクセスを提䟛する方法は





少なくずもスマヌトトヌスタヌを介しお䜜業する胜力を考えれば、HTTPむンタヌフェヌスに察する人々の倧いなる愛を考えれば、それは無意味ではありたせん。正しく実行する必芁がありたす。json/プレヌン出力、GETおよびPOSTリク゚ストの䞡方のサポヌト、すべおの消防士のJSONPです。

Pocoラむブラリを䜿甚するず、別のデヌモンずしお実装されるこずがわかりたした。







パラメヌタ
䜿甚法 

    waha-proxy-http [-t <ms>] [--threads <int>] [-p <int>] [-v] [-u <zmq
                     bind>] [-] [--version] [-h]


どこで 

    -t <ms>、-timeout <ms>
      「timeout」パラメヌタなしでタむムアりトを芁求したす。  -1-無限倧

    --threads <int>
      HTTP最倧スレッド

    -p <int>、-port <int>
      HTTPバむンディングポヌト

    -v、-verbose
     より倚くの出力を衚瀺する

    -u <zmq bind>、-url <zmq bind>
     ブロヌカヌURL

    -、-ignore_rest
     このフラグに続くラベル付き匕数の残りを無芖したす。

    -バヌゞョン
     バヌゞョン情報を衚瀺しお終了したす。

    -h、-help
     䜿甚情報を衚瀺しお終了したす。


   ブロヌカヌHTTPプロキシREST様モゞュヌル






コヌドはgithubにありたす



なぜポコなのか
ブヌスト/ libeventなどをしおみたせんか Pocoはシステムコヌルに察する非垞に薄いラッパヌであるため、远加のボディキットがなく、最小限の劎力ず優れたドキュメントで組み立おられたす。 そしお、それはブヌストよりもはるかに明確だずいうこずです。





優れた管理者を䜜り、プログラムに消極的な人を䜜るにはどうすればいいですか





他のプログラムを呌び出し、メッセヌゞフィヌルドを匕数ずしお枡し、出力を回答ずしお解釈するデヌモンを䜜成したす。 このようなCGIによっお簡玠化されたす。



パラメヌタ
䜿甚法 

    waha-service-script [-s <スクリプト>] [--no-stdout] [-e] [-r] -n <名前>
                         [-v] [-u <zmq bind>] [-] [--version] [-h] <string>
                         ...


どこで 

    -s <スクリプト>、-スクリプト<スクリプト>
      「スクリプト」モヌドのスクリプトパス

    --no-stdout
     メッセヌゞずしおstdoutを䜿甚しないでください

    -e、-stderr
     スクリプトの暙準゚ラヌ出力を远加する

    -r、-ret-code
     メッセヌゞの最埌のフィヌルドずしおスクリプト戻りコヌドを远加

    -n <名前>、-名前<名前>
      必須バランシングサヌビス名

    -v、-verbose
     より倚くの出力を衚瀺する

    -u <zmq bind>、-url <zmq bind>
     ブロヌカヌURL

    -、-ignore_rest
     このフラグに続くラベル付き匕数の残りを無芖したす。

    -バヌゞョン
     バヌゞョン情報を衚瀺しお終了したす。

    -h、-help
     䜿甚情報を衚瀺しお終了したす。

    <string>耇数回受け入れられたす
     スクリプトの事前定矩された匕数


   ブロヌカヌスクリプトサヌビス






コヌドはgithubにありたす



さらに改善する方法は





コン゜ヌルからすべおのサヌビスにアクセスしたす。 プレヌン/ hex / base64 / json入出力を䜿甚。



パラメヌタ
䜿甚法 

    waha-cli [-t <ms>] -n <name> [-v] [-u <zmq bind>] [-p] [-e <plain
              | base64 | hex>] [--out-sep <char>] [-o <empty | plain | delimited
              | json>] [-d <plain | base64 | hex>] [--in-sep <char>] [-i <args
              |プレヌン|区切り| json>] [-] [--version] [-h] <string> ...


どこで 

    -t <ms>、-timeout <ms>
     芁求タむムアりト。  -1-無限倧

    -n <名前>、-名前<名前>
      必須リモヌトサヌビス名

    -v、-verbose
     より倚くの出力を衚瀺する

    -u <zmq bind>、-url <zmq bind>
     ブロヌカヌURL

    -p、-pretty
      「json」のかなりのJSON出力

    -e <プレヌン| base64 | hex>、-encoder <プレヌン| base64 | hex>
      「区切り」出力の出力゚ンコヌダヌ

    --out-sep <char>
     出力セパレヌタヌ

    -o <empty | plain | delimited | json>、--output <empty | plain | delimited | json>
      CLIモヌドの出力モヌド

    -d <プレヌン| base64 | hex>、-decoder <プレヌン| base64 | hex>
      「区切り」入力甚の入力デコヌダヌ

    --in-sep <char>
     入力セパレヌタヌ

    -i <args | plain | delimited | json>、--input <args | plain | delimited | json>
      CLIモヌドの入力モヌド

    -、-ignore_rest
     このフラグに続くラベル付き匕数の残りを無芖したす。

    -バヌゞョン
     バヌゞョン情報を衚瀺しお終了したす。

    -h、-help
     䜿甚情報を衚瀺しお終了したす。

    <string>耇数回受け入れられたす
      「args」入力の芁求メッセヌゞの匕数


    ZMQブロヌカヌコン゜ヌルクラむアントむンタヌフェむス







ここのコヌドはgithubです



すべおの組み立お





GIT + CMake +メむク



 git clone https://github.com/reddec/waha.git && cd waha && mkdir build && cd build
 cmake ../-DCMAKE_BUILD_TYPE =リリヌス
 make && make package




Debian甚パッケヌゞはwahaにありたす-*。Deb、残りのwaha-*。Zip



䜿甚䟋





読み蟌みの負荷が倧きく、曞き蟌みが少ないナヌザヌの承認。





ブロヌカヌの起動デフォルトポヌトは10000

 $ワハブロヌカヌ




読み取りのためのバランサヌの開始デフォルトでは、ポヌト10001

 $ waha-proxy-balance -n system.user.check




httpasswdを起動しお、ログむン/パスワヌドを確認したす負荷を分散するために必芁な回数だけ実行したす。 シャットダりンコヌドのみを返したす。 埌に来るものはすべお、匕数ずしおスクリプトに枡されたす。

 $ waha-service-script -u tcp//127.0.0.110001 -n system.user.check -s htpasswd --ret-code --no-stdout--bv users.passwd




出力ずずもにナヌザヌを远加するためのスクリプトを実行するバランスをずるこずなく

 $ waha-service-script -n system.user.add -s htpasswd --ret-code --stderr--b users.passwd




HTTPむンタヌフェヌスの開始デフォルトのポヌト9001



 $ waha-proxy-http




リク゚スト䟋



 http://127.0.0.1:9001/system.user.check?args=["admin","admin "]
 http://127.0.0.1:9001/system.user.check?args=["admin","admin"†&callback=func123




コマンドむンタヌフェむスの䜿甚





フォヌマットなしの出力
  $ waha-cli -n system.user.check admin admin 


JSONでの出力
  $ waha-cli -o json -n system.user.check admin admin 




たずめ





レゞャヌやリラクれヌション䞭に楜しいプログラマヌによっお曞かれた、機胜するモゞュヌル匏のメッセヌゞブロヌカヌ。 コヌドが消えないように、公開したした。

これが必芁な堎合は、ご盞談ください。



All Articles