アプリケーションAは、我々は、このようなBはそのビーイングのように(使用不能にされているとき、そのアプリケーションAパブクライアントソケットを構成することができますどのように、そのデータを受け入れるためのサブサーバソケットを持つアプリケーションBにcontentiouslyストリームデータにパブリッシャークライアントを使用している2つの用途を考えます再デプロイ、再起動)A・バッファ保留中のすべてのメッセージおよびBは、利用可能なバッファ・メッセージをリアルタイムストリームとトラフとソケットのキャッチアップに行くとなったとき?
SUBのサーバが使用できない間、一言で言えば、どのように我々はいくつかの制限とPUBクライアントソケットバッファのメッセージを作るのですか?
PUBクライアントのデフォルトの動作は、ミュート状態でドロップすることですが、私たちは限界サイズのバッファにそれを変更することができれば、それは素晴らしいことだ、それはzmqで可能ですか?または私は、アプリケーションレベルでそれを行う必要があります...
HWMの意志(私は私のソケットにHWMとLINGERを設定しようとしましたが、私は間違っていないよ場合、彼らは私の出版社が加入者に接続され、低速消費者の場合、のためにのみ責任があるが、加入者は、パブリッシャがメッセージをバッファリングするために開始するように遅いですそれらのメッセージの制限数)...
私が使用しているjeromq
私は、JVMのプラットフォームをターゲットにしていますので、。
(非常に有益が実際に間違っていたが)私は他の2つの答え以来、迅速な更新を掲示しています、と私は他の人が私の受け入れ答えから誤解されたくいけません。だけでなく、あなたがzmqでこれを行うことができ、それが実際にデフォルトの動作です。
トリックは、それがメッセージをドロップ(と私はそれがメッセージをバッファリングしていないことを考えていた理由です)続ける前に、パブリッシャクライアントがサブスクライバサーバに接続したことがない場合ということですが、あなたのパブリッシャがサブスクライバに接続し、あなたが加入者を再起動した場合、発行者はメッセージをバッファリングしますHWMは、私が尋ねた、まさにあるに到達するまで...短いので、パブリッシャでのみ、それはメッセージをバッファリングすることの後にメッセージを受け付け、他の端に誰かがある知りたがっています...
ここでは(あなたはそれをコンパイルするためにいくつかの基本的な編集を行うために必要がある場合があります)、これを証明するいくつかのサンプルコードです。
私はこの依存関係を使用しましたorg.zeromq:jeromq:0.5.1
。
zmq-publisher.kt
fun main() {
val uri = "tcp://localhost:3006"
val context = ZContext(1)
val socket = context.createSocket(SocketType.PUB)
socket.hwm = 10000
socket.linger = 0
"connecting to $uri".log()
socket.connect(uri)
fun publish(path: String, msg: Msg) {
">> $path | ${msg.json()}".log()
socket.sendMore(path)
socket.send(msg.toByteArray())
}
var count = 0
while (notInterrupted()) {
val msg = telegramMessage("message : ${++count}")
publish("/some/feed", msg)
println()
sleepInterruptible(1.second)
}
}
そしてもちろん zmq-subscriber.kt
fun main() {
val uri = "tcp://localhost:3006"
val context = ZContext(1)
val socket = context.createSocket(SocketType.SUB)
socket.hwm = 10000
socket.receiveTimeOut = 250
"connecting to $uri".log()
socket.bind(uri)
socket.subscribe("/some/feed")
while (true) {
val path = socket.recvStr() ?: continue
val bytes = socket.recv()
val msg = Msg.parseFrom(bytes)
"<< $path | ${msg.json()}".log()
}
}
加入せずに最初の出版社を実行してみてください、あなたが加入者を起動したとき、あなたはいくつかの時間のために、出版社を再起動することなく、これまで...今停止加入者待ちのすべてのメッセージを逃し、再起動します。
ここでは実際にこの恩恵を受けて、私のサービスの一つの例です...これは構造体であります [current service]sub:server <= pub:client[service being restarted]sub:server <=* pub:client[multiple publishers]
私は途中でサービスを再起動するので、すべての出版社が彼らのメッセージをバッファリング開始、毎秒〜200件のメッセージを観察して、最終的なサービスが0にドロップを観察する(これらの1または2がハートビートです)その後、突然1000の+メッセージのバースト、入って来すべての出版社がそのバッファをフラッシュので(再起動は5秒程度かかりました)...私は実際にここに単一のメッセージを失うわけではありません...
あなたが持っている必要があることに注意subscriber:server <= publisher:client
ペアを(この方法の出版社は、(「私はこれらのメッセージを配信する必要がある唯一の場所があり、」あなたが出版社に結合し、加入者に接続してみてくださいすることができますが、あなたは、もはや単に疑わしい場合ので、出版社のバッファリングのメッセージは表示されません知っています加入者だけで切断されていること)、それはもはやデータを必要とするため、それをやっていないか、それが失敗したため、