- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 REQ -> ROUTER -> [DEALER,DEALER...DEALER]
设置,其中 REQ 是客户端,ROUTER 是队列,DEALER 套接字是处理的工作人员数据并将其发送回 ROUTER,ROUTER 将其发送回 REQ。当有足够的经销商来处理工作时,工作就很好。但如果我放慢经销商的速度,路由器将永远不会告诉我它的工作量超出了它的处理能力。
文档说:
ROUTER sockets do have a somewhat brutal way of dealing with messages they can't send anywhere: they drop them silently. It's an attitude that makes sense in working code, but it makes debugging hard. The "send identity as first frame" approach is tricky enough that we often get this wrong when we're learning, and the ROUTER's stony silence when we mess up isn't very constructive.
Since ØMQ v3.2 there's a socket option you can set to catch this error: ZMQ_ROUTER_MANDATORY. Set that on the ROUTER socket and then when you provide an unroutable identity on a send call, the socket will signal an EHOSTUNREACH error.
老实说,我不确定这是否与我遇到的问题相同。冷漠的沉默确实符合我所看到的。
这是设置代码:
var argsToString, buildSocket, client, q;
buildSocket = function(desc, socketType, port) {
var socket;
log("creating socket: " + (argsToString(Array.apply(null, arguments))));
socket = zmq.socket(socketType);
socket.identity = "" + desc + "-" + socketType + "-" + process.pid + "-" + port;
return socket;
};
argsToString = function(a) {
return a.join(', ');
};
client = buildSocket("client", 'req', clientPort);
q = buildSocket("q", "router", qPort);
q.setsockopt(zmq.ZMQ_ROUTER_MANDATORY, 1);
q.on('error', function() {
return log('router error ' + argsToString(Array.apply(null, arguments)));
});
如果需要,我可以发布更多代码。问题是,当 REQ 套接字每秒发送 10 条消息,但 DEALER 需要 2 秒才能完成工作时,ROUTER 只是忽略传入消息,而不管 ZMQ_ROUTER_MANDATORY 是多少。我已经发送了 1000 条消息,但从未见过任何套接字抛出错误 (.on 'error'
)。
有人谈论 ZMQ_HWM,但 Node 驱动程序似乎不支持 DEALER 或 ROUTER。
如何管理没有空间发送消息的路由器?
最佳答案
首先,如果您正在实现特定模式(据我所知,从您之前的问题来看,您正在实现 Paranoid Pirate),那么这样说总是有帮助的,因为它将为您的代码提供上下文.
偏执海盗中没有专门解决您所讨论的问题。您可以通过跳到 the Titanic pattern 的指南来看到这一点。 ...当您处理偶发的连接问题,或者在您的情况下,由于您的工作人员在新消息到达时仍在工作而导致偶发的可用性时,您必须维护队列中工作人员的状态知道您需要如何处理该消息...要么将其发送给可用的工作人员,要么将其存储在某个地方,以便当工作人员可用时,您可以将其拉出并发送。
如果您尽可能严格地执行此操作,则会破坏 ZMQ 的“队列”性质,但您可以避免 HWM 中固有的不确定性,即会丢弃消息,而不是使系统崩溃.
您可以维护一个缓冲区,继续向队列添加消息,直到您意识到您已进入 HWM 的 40%(这取决于消息的大小)...这将为您提供在开始保存消息之前先缓冲,但最终过程是相同的。
这是 ZMQ 将责任转移给应用程序设计者的一个领域,因为没有单一的“正确”方法可以适用于所有场景。
<小时/>编辑回应评论:
以下是我在 Node.js 中处理此问题的基本要点:
var worker_count = 0;
var job_count = 0;
// ...
q.on('message', function() {
// ...
if (msg.toString() == 'ready') worker_count++;
else job_count--;
// ...
// this could use some TLC, but here's the basic gist of the logic...
if (job_count >= worker_count) {
// we'll assume the message was cached when it was received from
// the req socket, if so nothing else to do here
}
else {
// figure out if there is a cached message ready to go, if so, then...
q.send(job);
job_count++;
}
});
关于javascript - 如何让 ZMQ 路由器在繁忙时引发错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24964626/
我正在使用 SharePoint Online 并使用 Windows Azure 托管访问 SPO 的进程。 我们已将启动任务添加到 Azure 角色以安装 http://www.microsoft
我有一个函数,它获取包含时间的源文件(csv 文件),读取它,然后按顺序对行进行排序并将它们写入目标文件中。但是,如果源 csv 文件不存在,我需要引发 FileNotFoundError。我之前曾引
我试图在目录不存在时引发错误,然后再打开该目录中的文件。根据this response我应该为我的问题使用最具体的异常构造函数,我认为它是 NotADirectoryError。但是运行下面的代码我得
在编码/开发生命的一天或另一天,我们确实遇到了这个特殊的情况,这是最常见的异常(exception)之一。我的问题是关于的而不是。为什么(我知道当我们尝试访问实际上指向null的引用变量的属性时会引发
我想知道在 python 中是否可以在一个 except block 中引发异常并在稍后的 except block 中捕获它。我相信其他一些语言默认会这样做。 这是它的样子" try: som
我有以下代码: br = mechanize.Browser() br._factory.is_html = True br.form = mechanize._form.ParseString(''
我刚刚发现,如果您有一个引发 TOO_MANY_ROWS 异常的 SELECT INTO,该变量仍会从查询检索到的第一条记录中分配值。这是预期的行为吗? 这是我的例子: for co in my_cu
当 SSH 显示 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 我知道当您重新安装远程服务器时会发生这种情况,但我尝试列出 其他原因 . 我知道如何
我有一个枚举和一个 EnumMap . 我将 map 放入一个类中以隐藏“字节”值。所以我有一个set(Parameter, int)和set(Parameter, boolean)方法。 publi
在什么情况下会redis-py引发以下 AttributeError 异常? redis-py 不是设计来引发仅基于 redis.exceptions.RedisError 的异常吗? 什么是合理的处
可悲的是,对此异常的引用通常具有异国情调,并且可能发生在您例如通过 Assembly.GetTypes() 枚举类型- 举个例子,它发生在我们的一个部署上,但同一组程序集在集成服务器上运行良好。 为了
我正在为 Android 下的特定平板电脑克隆一个存储库并获取源代码,我必须执行一个 python 脚本。当我执行它时,我收到此错误消息: Traceback (most recent call la
首先,执行此操作(在运行 4.4.2 的 Nexus 5 上测试): 将 PRIORITY_LOW 通知传递给 Service.startForeground()。 观察通知不显示在状态栏中。 使用相
我尝试使用 AppEngine 的 python 模块 api 来获取使用基本缩放的模块的实例数。在我模块的 yaml 文件中,我明确设置了 max_instances 参数。我希望 get_num_
当我如下运行我的 spark python 代码时: import pyspark conf = (pyspark.SparkConf() .setMaster("local")
在我的系统上,一段适用于 Python 2 的代码不适用于 Python 3。 f = open("plotwidget.svg") svgData = f.read() xml_stream = Q
我是 PHP 和 SQL 的新手,但我正在创建一个登录系统。我遇到的问题是: You have an error in your SQL syntax; check the manual that c
我有一个使用 ebaysdk 库的 python 代码,当我运行代码并输入关键字进行搜索时,我得到了这个错误。 Traceback (most recent call last): File "eba
当我将表单数据发送到我的 Flask 应用程序时,出现以下错误。它说它将使用 UTF-8 编码,但语言环境已经是 UTF-8。这个错误是什么意思? /home/.virtualenvs/project
在python2.7中,跟随pympler example : from anotherfile import somefunction, somecustomclass from os import
我是一名优秀的程序员,十分优秀!