- 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/
Rust 支持 pub和 pub(super) . pub使父模块可以访问项目...和pub(super)似乎也做同样的事情。我试过玩下面的例子,并交换 pub和 pub(super)似乎没有效果:
我正在尝试运行 this拖放 API。当我尝试运行 dart 文件(使用 dart 编辑器)时,出现以下错误: could not start pub serve or connect to pub
根据pub get docs pub get 和 pub Upgrade 之间的主要区别是: If a lockfile already exists, pub get uses the versio
我see函数的可见性可以在模块内声明为 pub(self)。这与没有 pub 属性的私有(private)函数有何不同?如果它们没有区别,为什么会存在这种语法? 最佳答案 pub(restricted
我正在运行 pub install 以便我可以使用作为 dart sdk 一部分的 intl 包(我需要使用 DateFormat 类)。我已经在我的项目中安装了其他包,例如 XML 解析器和演示文稿
假设我在 Rust 包中有这个文件层次结构: src/... src/m1/mod.rs src/m1/path/m2.rs 拥有以下行的实际区别是什么: pub mod path::m2; 在我的文
其中一个比另一个更安全吗? 最佳答案 id_rsa.pub 和 id_dsa.pub 是 id_rsa 和 id_dsa 的公钥。 如果您询问与 SSH 相关的问题,id_rsa 是 RSA key
pub 是 Dart 的包管理器。 Flutter 是一个使用 Dart 的移动应用 SDK。如何创建依赖于或以 Flutter 为目标的包? 最佳答案 要从 pub 包中声明对 Flutter 的依
id_rsa.pub 文件基本上是 Linux 主文件夹下 .ssh 文件夹中的一些加密文本,用于公钥加密。它使用 .pub 文件格式。但为什么这种文件格式也恰好是 Microsoft Publish
使用当前版本的angular.dart.tutorial , 使用 Chapter_04 对于“pub serve”,main.dart.js 是一个 42337 行的文件,示例运行良好。 对于“pu
假设我正在运行我自己的 pub-dartlang 实例对于私有(private)酒吧供稿;如何在 pubspec.yaml 中注明哪些软件包来自私有(private)提要与 pub.dartlang.
我们通过运行脚本来实现DART自动化,该脚本导航到项目文件夹(.yaml文件所在的位置)并运行“pub get”和“pub build”。它工作了一段时间,但现在(两种情况下)我们都得到了: Unha
我刚刚安装了 Dart Editor 并创建了一个简单的 Web 应用程序,当我单击运行时它显示此错误并且没有任何 react 。 “无法启动 pub 服务或连接到 pub” dart editor
当我尝试在 android studio 中打开大部分已下载的 flutter 应用程序时,它一直告诉我“Pub get”尚未运行,当我按下“获取依赖项”或升级依赖项时,它会向我显示该错误。我已经把a
在哪里可以找到用于搜索和列出已安装的打包版本和可用升级版本的命令行工具? 我想不出任何其他的软件包管理工具,它们不包含列出已安装版本或查找可用升级的命令,而无需实际升级。 例如,如果我的pubspec
前两天升级到 Flutter 2.0 开始面对 Execution failed for task ':app:compileFlutterBuildDebug'由于一些包裹。 然后我降级了,但错误仍
下面提供了相关的程序代码。我经常在开源项目中看到这样的代码,可以在Linux和Windows上运行。有人告诉我,这是为了避免编译警告。真的是这样吗? class Base { public:
我有一个带有简单测试代码的函数,例如: exports.helloPubSub = (event, context) => { const message = event.data
无法解析 URL“https://pub.dartlang.org”。错误 (69):无法“发布升级”flutter 工具。五秒后重试...(还剩 9 次尝试) 这是我创建或升级flutter时flu
我正在尝试制作一个脚本来控制农场中的 Android 设备,adb connect 通过 OpenSTF 建立连接。 .设备接受来自客户端的连接的要求之一是在 OpenSTF 中提供 adbkey.p
我是一名优秀的程序员,十分优秀!