問題タブ [zeromq]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
architecture - zeromq サービスとデータ アクセス
私は現在 zeromq を試しており、分散サービス指向アーキテクチャを構築しています。各サービスは、共通データベースのデータを操作する必要があります。
最善の方法は何ですか:
- モデルを定義するすべてのサービスで共有ライブラリを使用します。各サービスはデータベースに接続します
- データベースを抽象化するデータ サービスを使用します。他のすべてのサービスは、このサービスを介してデータにアクセスします。データは、プロトコル バッファを使用して送信できます。
2 番目のオプションの方がきれいに思えますが、データへの要求ごとにネットワーク通信が 1 つ増えるため、パフォーマンスへの影響が心配です。
将来的には、データベース以外のデータ ソースが存在する可能性があります。そのため、私は 2 番目のオプションを念頭に置いていましたが、それを過度に設計することを恐れています。
python - LAN経由でより大きなデータチャンクを送信するとZMQが失敗する
基本的に私は単一のマスターシステムと3つのスレーブシステムを持っています。データ分割の問題を本質的に解決するため、要求/応答フェーズを使用してコンテンツを3つのクライアントシステムに送信しました。3つのクライアントシステムにコンテンツを送信した後、REQ / REPトポージーを担当するソケットを閉じ、3つのシステムすべてからコンテンツを受信するために、個々のスレーブシステムとペアになる別のソケットの束を作成しました。コード全体をローカルホストで実行しましたが、問題はなく、クライアントシステムの1つからマスターシステムに40MBのデータセットを送信しようとしても、すべてがスムーズに進みました。
問題は、ラボでこれをLAN経由で実装しようとしたときです。
REQ / REPフェーズはスムーズに実行されるため、基本的にすべてのクライアントシステムがデータセットをフェッチして処理します。
大量のデータセットを処理しようとすると、クライアントとの個別のPAIRが失敗します(40MBのように、コンテンツを辞書にロードし、辞書オブジェクトのサイズが24MBになっているため、大きくは考えていません)。理由は処理されません。
LAN上での動作とシステム上での動作が異なる理由がわかりません。
私がLANで使用しているシステムは、2GBのRAMを搭載したAMDデュアルコア64ビットです(4つのシステムすべて)
コードを実行することに興味がある場合:
マスターシステムコード:http ://codepad.org/5uVCEb42
Salve1:http ://codepad.org/LNmi9vu2
Slave2:http ://codepad.org/0vmEAJYc (これはファイルから40MBのコンテンツを取り込み、最終的にマスターシステムに渡します)
Slave3:http ://codepad.org/d565lgiv
c - ZeroMQ メッセージを使用したスレッド間通信
zeroMQ
複数のスレッド間でメッセージング システムを実装する方法として使用しようとしています。以下のコードを試しましたが、うまくいきません。具体的には、各スレッドでの呼び出しは、zmq_recv
実行されるメッセージを待機/ブロックしません。
このコードについて教えてください。
Linux OS と gcc を使用しています
よろしくお願いします
AFG
php - ギアマンvsZeroMQ
これらのエンジンを使用した分散アーキテクチャに関するフィードバックはありますか?どちらが最高ですか、それともどの場合が最高の選挙ですか?
よろしく!
python - 非同期メッセージ キュー - どの組み合わせですか?
Web サイトの背後にあるプッシュ メッセージング サービスに使用するパッケージの組み合わせを決定しようとしています... 私の現在の考えは、Tornado + Socket.IO (Tornadio) と ZMQ を使用することです。しかし、Mongrel2 の関与も検討していました。次に、ZMQ と Eventlet を使用して、Tornado から取得した Brubeck と呼ばれる同様のプロジェクトもあります。私の主な質問はこれです... Tornado を使用する場合、Mongrel2 の利点がどこで発揮されるかを理解しようとしています。その時点でトルネードは必要ですか?その時点で、Mongrel2 python ハンドラーを作成するだけでよいと考えました。私は websockets/jssockets の使用に焦点を当てたいと思います。そのため、Socket.IO の使用は興味深いものでした。内部ですべての後方互換性を処理するからです。
検討対象のツールが Python focus、Tornado、Mongrel2、ZMQ、Brubeck、および Socket.IO である場合、websocket をサポートするための最適な組み合わせとして、どのような推奨事項がありますか? Mongrel2 を使用することは、スケーラビリティのアイデアにとって非常に魅力的であり、より多くの Python ハンドラーをオンにするだけでした。
2012 年 1 月 1 日更新
最初は Tornado + TornadIO + ZeroMQ を使用し、サーバーが機能していました。しかし、最終的には Go ( www.golang.org ) を学び、組み込みの並行性を備えた純粋な Go を使用してサーバーを書き直しました。私のPythonバージョンよりも多くの機能を備えていても、Pythonよりも10倍以上高速になりました:http://www.justinfx.com/2011/07/28/go-language-for-python-programmers/
GoチームがGo 1.0に向けてより多くのリリースを行うにつれて、スピードを上げ続けているようです
linux - ZeroMQ を使用した反転 PUB/SUB の問題
ZeroMQ で「反転」PUB/SUB をセットアップしようとしています。
サブスクライブ (SUB) ソケットがいくつかの長寿命サーバーに属していることを意味しますzmq_bind()
。パブリッシング (PUB) ソケットは短命のクライアントであり、zmq_connect()
.
シングルipc://
ソケットを使用しています。
出版社からのメッセージが各購読者に届くことを期待しています。
問題: サブスクライバ プロセスの 1 つだけがメッセージを受信します。そのプロセスが停止すると、パブリッシャーはzmq_term()
.
この操作モードは zmq でサポートされていますか? はいの場合、私は何が間違っていますか? いいえの場合、必要なものを実装する方法は?
いくつかの追加の詳細を含む最小限の例 (Lua では、これは重要ではありません): https://gist.github.com/938429
linux - PUB/SUB の存続期間が短いパブリッシャーと存続期間が長いサブスクライバー
コンテキスト: OS: Linux (Ubuntu)、言語: C (実際には Lua ですが、これは問題ではありません)。
私は ZeroMQ ベースのソリューションを好みますが、正気であれば何でも受け入れます。
注: 技術的な理由から、ここでは POSIX シグナルを使用できません。
1 台のマシン (「ワーカー」) に複数の同じ長寿命プロセスがあります。
ときどき、コマンドライン ツールを介して各プロセスに制御メッセージを配信する必要があります。例:
このマシンの各ワーカーはrun-collect-garbage
メッセージを受信する必要があります。注: ソリューションがクラスター内のすべてのマシンのすべてのワーカーに対して何らかの方法で機能する場合は完璧ですが、その部分は自分で書くことができます。
実行中のワーカーに関する情報を保存する場合、これは簡単に実行できます。たとえば、それらの PID を既知の場所に保持し、その中のどこかに PID を持つ既知のパスで制御 Unix ドメイン ソケットを開きます。または、TCP ソケットを開き、ホストとポートをどこかに保存します。
しかし、これには格納された情報の慎重な管理が必要になります。たとえば、ワーカー プロセスが突然停止した場合はどうなるでしょうか。また、情報をどこかに保存する必要があるため、複雑さが増します。
PUB/SUB スタイルでこれを行う良い方法はありますか? つまり、ワーカーはサブスクライバーであり、コマンド アンド コントロール ツールはパブリッシャーであり、彼らが知っているのは、いわばメッセージを受け取る単一の「チャネル URL」だけです。
追加要件:
- コントロール チャネルへのメッセージは、ポーリング (選択など) ループからワーカーを起動する必要があります。
- メッセージの配信は保証されている必要があり、リッスンしているすべてのワーカーに到達する必要があります。
- ワーカーには、ブロックせずにメッセージを監視する方法が必要です — 理想的には、上記のポーリング/選択/その他のループによるものです。
- 理想的には、ワーカー プロセスはある意味で「サーバー」である必要があります。「チャネル サーバー」(存在する場合) への接続を永続的に維持する必要はありません。または、これはフレームワークによって透過的に行われる必要があります。
linux - ZeroMQ:誰かがUnixドメインソケットの背後でリッスンしているかどうかを確認します
コンテキスト:Linux(Ubuntu)、C、ZeroMQ
ipc://
SUB ZeroMQソケット(物理的にはUnixドメインソケット)でリッスンするサーバーがあります。
ソケットに接続し、そのメッセージを公開して切断する必要があるクライアントがあります。
問題:サーバーが強制終了された場合(または不自然に停止した場合)、ソケットファイルはそのまま残ります。クライアントがこの古いソケットに接続しようとすると、でブロックされzmq_term()
ます。
サーバーが存在しない場合にクライアントがブロックされないようにする必要がありますが、サーバーが稼働しているがビジー状態の場合は配信を保証します。
外部の魔法(PIDファイルのチェックなど)によってサーバーの存続期間を追跡できないと仮定します。
ヒントはありますか?
recursion - tornado: websocket と iostream 間の再帰ループ
これは、Tornado を使用した最初のプロジェクトです... TornadIO + ZMQ を使用してメッセージ サービスを構築しています。私はpyzmqのioloopを使用しています。iostream と websocket の間の再帰ループの問題に遭遇しましたが、その理由を特定することはできません。クライアントは正常に接続し、大量のメッセージを送信し、正常に受信したようです。他の誰かが接続し、しばらくは問題なくクラッシュします。切断を適切に処理していないのか、メッセージ内の何かがトルネード コードで読み取りエラーを引き起こしているのかはわかりません。私のサーバーで実際に起こっていることは、クライアントが接続してメッセージを送信することだけです。メッセージは、Websocket を介して接続されている他のすべての人にブロードキャストされます。
ここで実際に何が起こっているのか、誰かが教えてくれるかもしれません。
// トレースバックの開始...
[E 110426 01:45:28 ioloop:295] Exception in I/O handler for fd 22
Traceback (most recent call last):
File "/usr/local/lib/python2.6/dist-packages/pyzmq-2.1.4-py2.6-linux-x86_64.egg/zmq/eventloop/ioloop.py", line 282, in start
self._handlers[fd](fd, events)
File "/usr/local/lib/python2.6/dist-packages/pyzmq-2.1.4-py2.6-linux-x86_64.egg/zmq/eventloop/stack_context.py", line 133, in wrapped
callback(*args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/iostream.py", line 199, in _handle_events
self._handle_read()
File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/iostream.py", line 258, in _handle_read
if self._read_from_buffer():
// START: 再帰的にループするブロック
File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/iostream.py", line 325, in _read_from_buffer
self._consume(loc + delimiter_len))
File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/iostream.py", line 230, in _run_callback
callback(*args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/stack_context.py", line 173, in wrapped
callback(*args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/websocket.py", line 193, in _on_end_delimiter
self._receive_message()
File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/websocket.py", line 178, in _receive_message
self.stream.read_bytes(1, self._on_frame_type)
File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/iostream.py", line 149, in read_bytes
if self._read_from_buffer():
File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/iostream.py", line 314, in _read_from_buffer
self._run_callback(callback, self._consume(num_bytes))
File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/iostream.py", line 230, in _run_callback
callback(*args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/stack_context.py", line 173, in wrapped
callback(*args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/websocket.py", line 183, in _on_frame_type
self.stream.read_until("\xff", self._on_end_delimiter)
File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/iostream.py", line 133, in read_until
if self._read_from_buffer():
// 先頭に戻る (iostream の 325 行目)
何か助けて?????? ubuntu Linuxでpypi tornado 1.2.1、tornadIO 0.0.4、zeromq 2.1.4、およびpypi pyzmqを使用しています
編集: on_close() ハンドラーのこのスニペットに由来するようです:
if self._client_sub and self._client_sub.stream:
try:
self._client_sub.stream.stop_on_recv()
self._client_sub.stream.stop_on_err()
そしてここにトレースバックがあります:
[E 110425 20:52:50 messgr:202] Failed to close stream and sub socket on client disconnect
Traceback (most recent call last):
File "messgr.py", line 198, in on_close
try:
AttributeError: 'NoneType' object has no attribute 'stream'
Traceback (most recent call last):
File "/usr/lib/python2.6/logging/init.py", line 776, in emit
msg = self.format(record)
File "/usr/lib/python2.6/logging/init.py", line 654, in format
return fmt.format(record)
File "/usr/local/lib/python2.6/dist-packages/tornado-1.2.1-py2.6.egg/tornado/options.py", line 362, in format
record.exc_text = self.formatException(record.exc_info)
File "/usr/lib/python2.6/logging/init.py", line 416, in formatException
traceback.print_exception(ei[0], ei[1], ei[2], None, sio)
File "/usr/lib/python2.6/traceback.py", line 125, in print_exception
print_tb(tb, limit, file)
File "/usr/lib/python2.6/traceback.py", line 69, in print_tb
line = linecache.getline(filename, lineno, f.f_globals)
File "/usr/lib/python2.6/linecache.py", line 14, in getline
lines = getlines(filename, module_globals)
File "/usr/lib/python2.6/linecache.py", line 40, in getlines
return updatecache(filename, module_globals)
何が起こるかというと、トレースバックが 1 つ発生するということです。その後、それはスタックしているように見え、2 回、さらに 3 回... 際限なく発生します。
user-interface - クロスプラットフォーム開発に ZeroMQ を使用していますか?
Haskell には大きなコンソール アプリケーションがあり、クロス プラットフォームの作成と GUI の追加を担当しています。
要件は次のとおりです。
- 可能な限りネイティブなルック アンド フィール。
- 可能であれば、Windows および Mac OS X、Linux 用のクライアント。
- 個別のランタイムをインストールする必要はありません。
- ネットワーク通信不要。Haskell コードは、ネットワーク経由で送信できない非常に機密性の高い情報を扱います。これが、これが Web アプリケーションではない唯一の理由です。
さて、この質問の本当の理由は、私が現在研究している 1 つの解決策を説明し、私が考えていない理由を求めて、これを悪い考えにすることです。
私の解決策はネイティブGUIです。Windows の Winforms、Mac OS X の Cocoa、および Linux の GTK/Glade は、単純にプレゼンテーションを処理します。次に、Haskell コードの上にレイヤーを作成し、ZeroMQ を使用してメッセージを処理し、場合によってはデータを前後にシリアル化するための protobuf を使用して、UI との間のメッセージのレスポンダーにします。したがって、ネイティブ アプリケーションが起動し、それ自体がすべての魔法が発生するデーモンを起動し、メッセージを送受信します。
デーモンがそれを開始したアプリケーションからの接続のみを受け入れるようにすることと、高度な GUI 要素 (テーブル ビュー、セルなどを考えています) に適切なデータを前後に提供するという課題は別として、私はしません。これには多くの欠点があります。
私が考えていないことは、これを悪い考えにしているのでしょうか?
一見したところ、すべてのプラットフォームで GTK を使用するつもりだったことに言及する必要があります。問題は、Haskell に対する GTK と Glade のサポートが近づいている一方で、結果が「正しく」見えないことです。それは近いですが、この作品の小切手をたまたま書いている人々にその解決策が受け入れられないようにする微妙な方法で十分にネイティブではありません。
また、複数のプラットフォームの問題、したがって gui の複数の言語の問題は問題ではないため、Haskell コードとの相互運用性について何かを単純化しない限り、その問題を解決する他の方法を必ずしも探しているわけではありません。