- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我看到使用 的奇怪行为ZMQ_PUB
.
我有一个制作人 .connect()
-s 到不同的进程.bind()
在 ZMQ_SUB
socket 。
订阅者全部.bind()
, 发布者 .connect()
-s。
当生产者启动时,它会创建一个 ZMQ_PUB
socket 和 .connect()
-s 到不同的进程。然后它立即开始定期发送消息。
正如预期的那样,如果没有连接的订阅者,它会丢弃所有消息,直到订阅者启动。
然后流程正常工作,当订阅者启动时,它会从那一刻开始接收消息。
现在,问题是:
ZeroMQ examples
"A publisher has no connected subscribers, then it will simply drop all messages."
IMPORTANT UPDATE!!!!!
Before posting this question
I had tried different solutions. One was to setZMQ_LINGER
to 0, which didn't work.
I addedZMQ:IMMEDIATE
, and it worked, but I just found out thatZMQ:IMMEDIATE
alone does not work. It requires alsoZMQ_LINGER
.
Luis Rojas 3 hours ago
#include <stdio.h>
#include <stdlib.h>
#include <libgen.h>
#include <unistd.h>
#include <string>
#include <zeromq/zmq.hpp>
int main( int argc, char *argv[] )
{
if ( argc < 2 )
{
fprintf( stderr, "Usage : %s <remoteUri1> [remoteUri2...]\n",
basename( argv[0] ) );
exit ( EXIT_FAILURE );
}
std::string pLocalUri( argv[1] );
zmq::context_t localContext( 1 );
zmq::socket_t *pSocket = new zmq::socket_t( localContext, ZMQ_PUB );
if ( NULL == pSocket )
{
fprintf( stderr, "Couldn't create socket. Aborting...\n" );
exit ( EXIT_FAILURE );
}
int i;
try
{
for ( i = 1; i < argc; i++ )
{
printf( "Connecting to [%s]\n", argv[i] );
{
pSocket->connect( argv[i] );
}
}
}
catch( ... )
{
fprintf( stderr, "Couldn't connect socket to %s. Aborting...\n", argv[i] );
exit ( EXIT_FAILURE );
}
printf( "Publisher Up and running... sending messages\n" );
fflush(NULL);
int msgCounter = 0;
do
{
try
{
char msgBuffer[1024];
sprintf( msgBuffer, "Message #%d", msgCounter++ );
zmq::message_t outTask( msgBuffer, strlen( msgBuffer ) + 1 );
printf("Sending message [%s]\n", msgBuffer );
pSocket->send ( outTask );
sleep( 1 );
}
catch( ... )
{
fprintf( stderr, "Some unknown error ocurred. Aborting...\n" );
exit ( EXIT_FAILURE );
}
}
while ( true );
exit ( EXIT_SUCCESS );
}
#include <stdio.h>
#include <stdlib.h>
#include <libgen.h>
#include <unistd.h>
#include <string>
#include <zeromq/zmq.hpp>
int main( int argc, char *argv[] )
{
if ( argc != 2 )
{
fprintf( stderr, "Usage : %s <localUri>\n", basename( argv[0] ) );
exit ( EXIT_FAILURE );
}
std::string pLocalUri( argv[1] );
zmq::context_t localContext( 1 );
zmq::socket_t *pSocket = new zmq::socket_t( localContext, ZMQ_SUB );
if ( NULL == pSocket )
{
fprintf( stderr, "Couldn't create socket. Aborting...\n" );
exit ( EXIT_FAILURE );
}
try
{
pSocket->setsockopt( ZMQ_SUBSCRIBE, "", 0 );
pSocket->bind( pLocalUri.c_str() );
}
catch( ... )
{
fprintf( stderr, "Couldn't bind socket. Aborting...\n" );
exit ( EXIT_FAILURE );
}
int msgCounter = 0;
printf( "Subscriber Up and running... waiting for messages\n" );
fflush( NULL );
do
{
try
{
zmq::message_t inTask;
pSocket->recv ( &inTask );
printf( "Message received : [%s]\n", inTask.data() );
fflush( NULL );
msgCounter++;
}
catch( ... )
{
fprintf( stderr, "Some unknown error ocurred. Aborting...\n" );
exit ( EXIT_FAILURE );
}
}
while ( msgCounter < 5 );
// pSocket->setsockopt( ZMQ_UNSUBSCRIBE, "", 0 ); NOT UNSUBSCRIBING
pSocket->close();
exit ( EXIT_SUCCESS );
}
最佳答案
问:为什么会这样?
因为SUB
实际上仍然连接(不够“断开”)。
是的,可能会令人惊讶,但是 杀戮 SUB
-进程,在.bind()
上- 或 .connect()
-套接字传输媒体的附加侧,不代表 ,I/O 泵的有限状态机已“移动”到断开状态。
鉴于此, PUB
-side 没有其他选择,只能考虑 SUB
-side 仍然存在和连接(即使进程在 PUB
的视线之外被静默杀死)并且对于这种“分布式”状态,ZeroMQ 协议(protocol)定义的行为( PUB
-side 职责)收集所有临时消息(是的,隐形死)SUB
-scriber,其中 PUB
-side 仍然认为生活公平(但可能只是在传输 I/O 级别或某些远程 CPU 资源匮乏或并发引入的暂时间歇 {本地|远程}阻塞状态等)。
所以它缓冲...
万一你暗杀了 SUB
-side 代理似乎更优雅一些(在套接字资源实例上使用归零的 ZMQ_LINGER
+ 适当的 .close()
) PUB
-side 将识别“分布式”系统系统范围的有限状态自动机转变为真正的“断开连接”状态,并且在 PUB
上将发生适当的行为改变-“分布式-FSA”的一侧,不存储此“可见”确实“断开连接”的任何消息-ed SUB
- 正是文档所述。
“分布式-FSA”在识别“超出本地主机控制范围的状态变化事件”方面的方法非常薄弱。KILL
- 一个远程进程,它实现了“分布式- FSA”是一个毁灭性的事件,而不是如何保持系统正常工作的方法。对于此类外部风险的一个不错的选择可能是
听起来很复杂?
哦,是的,确实很复杂。这正是 ZeroMQ 为我们解决这个问题的原因,让我们可以自由地享受基于这些(已经解决的)低级复杂性设计我们的应用程序架构的乐趣。
分布式系统 FSA(由子 FSA-s 分层组成的系统范围的 FSA)
想象一下在引擎盖下默默地发生了什么,想象一下只有一对简单的串联 FSA-FSA - 正是这对 .Context()
实例尝试以最简单的 1:1 为我们处理PUB/SUB
用例 KILL
的场景-s SUB
上的所有子 FSA-s -side 不承认 PUB
的意图-边。甚至 TCP 协议(protocol)(同时存在于 PUB
-side 和 SUB
-side 上)也有几个来自 [ 的状态转换。 ESTABLISHED
] 到 [ CLOSED
] 状态。
分布式系统的 FSA-of-FSA-s 的快速 X 射线 View
(为了清楚起见,仅描述了 TCP 协议(protocol) FSA)
PUB
-边:
.socket( .. )
实例的行为 FSA:
SUB
-边:
(由 nanomsg 提供)。
关于zeromq - 为什么 ZeroMQ PUB 在没有连接订阅者的情况下对消息进行排队? (好吧, "disconnected"SUB-s),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41700291/
我有一些基于 TThreads 的操作。现在我需要创建包含要完成的作业列表的线程,然后在前一个完成后立即触发每个线程...我应该如何编写它?我不能允许线程同时运行,因为可能有超过 10 000 个操作
我正在尝试使用 RxJS 来实现服务调用限制/排队。 例如,Google Maps 的 Geocoder API。假设我不希望它每秒被调用一次以上,但是我的应用程序的一个或多个部分可能会比这更频繁
我目前正在通过 freecodecamp 网站的 javascript 部分进行练习,我试图理解为什么特定的方法可以解决它。 function nextInLine(arr, item) { /
详情 我有一个带有动画的功能,当点击按钮时它会.append一个div到body。然后,div 将为其位置向下移动一点点设置动画。添加另一个时,所有 div 也会向下移动,因此它们不会重叠。 现在我们
我有一个正在发送 http 请求的应用程序,每次用户键入时都会返回一个 promise 。我让它每 500 毫秒去抖一次。有时我请求的 api 需要很长时间才能响应。例如,我对 a 发出搜索请求,该请
我一直在做一项作业,涉及实现包含空指针的队列,以便它们可以针对任何类型的数据进行泛化。我目前遇到一个奇怪的问题,虽然出队节点减少了列表的大小但没有返回我期望的节点。在出列操作中省略对 free() 的
我正在寻找概述“排队”的文章和引用资料(我在这里可能甚至没有使用正确的术语)。我希望通过 Redis、RabbitMQ、Celery、Kombu 以及我尚未了解的任何其他组件以及它们如何组合在一起的世
我使用 mbostock/queue用于排队一些异步操作。更多的是速率限制(UI 生成的事件很少,后端可以慢慢处理),并确保它们按顺序处理。我像这样使用它 function request(d, cb
我有我的 android 应用程序,它不是为离线工作而构建的,因此它依赖于网络连接/数据。 应用程序进行大量网络调用,使用新数据集更新 api。 我正在对其进行更改以使其脱机工作。 方法我想我将创建一
我想将 div 的内容更改 3 次,每次更改之间延迟 1 秒。delay() 在此代码中不起作用: $('#import-status-msg').html('Importing content ..
我需要根据存储在数据库中的时间线在 jQuery 中制作一系列动画。我将这些信息与函数名称(动画、幻灯片、淡入淡出...)、函数的选项/参数以及函数的回调一起存储。 我知道 jQuery 确实有 .q
我有以下方法 public async Task SomeMethod(parameters) { // here we execute some instructions which are
在我的 winforms 应用程序中,我有一个包含对象的队列: Queue _queuedRows = new Queue(); 对于每个对象,我必须启动一个单独的 backgroundwor
我有以下代码: for (int i = 1; i <= 500; i++) { BackgroundWorker t = new BackgroundWorker(); t.DoWo
我有一个 CAShapeLayer,我在其中设置了一个圆圈的动画。动画是先顺时针“撤消”圆圈,然后顺时针重画圆圈。有点像“旋转圈”。另一种说法是:将路径描边终点移动到起点,然后将起点移到终点。 动画本
所以,在前一段时间了解完成 block 之后,我非常喜欢使用完成 block 。我喜欢关闭,我喜欢将任何东西传递到任何我想要的地方的能力。 作为线程编程的新手,我一直远离 GCD 和 NSOperat
我有一些使用 FMDB sqllite 包装器 ( https://github.com/ccgus/fmdb ) 的代码,并且我希望从多个线程执行此代码。因此,我使用 FMDatabaseQueue
页面加载速度比预期慢。我用 Firebug 检查了时间线,我看到很多图像阻塞: http://i.imgur.com/tenTNVH.png 我想我做错了什么。 (我知道我这里有双 jquery,会消
我在使用 Alamofire 时遇到任务执行问题我使用了两次 Alamofire,第一次是收集数据( token ),然后我将使用它来发送我的 Post 请求。 我的两次请求之间的问题,数据的恢复是在
我想知道如何将选定的 YouTube 视频添加到临时播放列表/播放队列中? 我有一个选项,用户必须选择要包含在播放队列中的所有视频。 Click on the ADD icon (black back
我是一名优秀的程序员,十分优秀!