问题标签 [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 并构建一个面向服务的分布式架构。每个服务都需要处理来自公共数据库的数据。
最好的方法是什么:
- 在定义模型的所有服务中使用共享库。每个服务都连接到数据库
- 使用抽象数据库的数据服务。所有其他服务都通过该服务访问数据。可以使用协议缓冲区传输数据。
第二个选项对我来说似乎更干净,但我担心对性能的影响,因为每个数据请求都有一个网络通信。
将来,可能会有数据库以外的数据源。这就是为什么我想到了第二种选择,但我害怕过度设计它。
python - 通过 LAN 发送更大的数据块时 ZMQ 失败
基本上我有一个主系统和 3 个从系统。我已经使用请求/响应阶段将内容发送到我的 3 个客户端系统,因为它本质上解决了我的数据拆分问题。将内容发送到我的 3 个客户端系统后,我关闭了负责 REQ/REP 拓扑的套接字,并创建了另一组与各个从属系统配对的套接字,以便从所有 3 个系统接收内容。我在 localhost 中运行了整个代码,我没有任何问题,一切都很顺利,即使我尝试从一个客户端系统向主系统发送 40MB 数据集。
问题是当我尝试在我的实验室中通过 LAN 实现这个时
REQ/REP 阶段运行平稳,因此基本上所有客户端系统都获取数据集以进行处理。
当我尝试处理大量数据集(比如 40MB ,我不认为它更大,因为我将内容加载到字典中并且字典对象的大小达到 24MB )时,带有客户端的单个 PAIR 有点失败,它有点窒息,对于某些人来说原因不处理。
我不知道为什么它在 LAN 上的行为与我的系统不同。
我在 LAN 中使用的系统是 AMD 双核 64 位和 2GB RAM(所有 4 个系统)
如果您有兴趣运行代码:
主系统代码:http ://codepad.org/5uVCEb42
救治1: http ://codepad.org/LNmi9vu2
Slave2:http ://codepad.org/0vmEAJYc (这个从一个文件中获取40MB的内容,最后传递给Master系统)
奴隶 3: http ://codepad.org/d565lgiv
c - 使用 ZeroMQ 消息的线程间通信
我正在尝试zeroMQ
用作在多个线程之间实现消息传递系统的一种方式。我尝试了下面的代码,但它不起作用;具体来说,每个线程中的调用zmq_recv
不会等待/阻止任何消息的执行。
你能帮我处理这段代码吗?
我正在使用 Linux 操作系统和 gcc
此致
AFG
php - Gearman vs ZeroMQ
有人对这些引擎的分布式架构有一些反馈吗?哪个是最好的,或者在什么情况下哪个是最好的选举?
问候!
python - 异步消息队列 - 哪种组合?
我一直在尝试确定将哪种软件包组合用于网站后面的推送消息服务......我目前的想法是使用 Tornado + Socket.IO (Tornadio) 和 ZMQ。但我也在考虑涉及 Mongrel2。然后还有一个类似的项目叫做 Brubeck,它来自 Tornado,使用 ZMQ 和 Eventlet。我的主要问题是……我试图了解如果我要使用 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 快 10 倍以上,即使功能比我的 Python 版本更多: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://
套接字。
我希望来自发布者的消息会到达每个订阅者。
问题:只有一个订阅者进程接收到消息。如果该过程终止,发布者将陷入zmq_term()
.
zmq是否支持这种操作模式?如果是,那我做错了什么?如果没有,那么如何实现我需要的?
带有一些额外细节的最小示例(在 Lua 中,但这不重要):https ://gist.github.com/938429
linux - 具有短期发布者和长期订阅者的 PUB/SUB
上下文:操作系统:Linux(Ubuntu),语言:C(实际上是 Lua,但这不重要)。
我更喜欢基于 ZeroMQ 的解决方案,但会接受任何足够理智的东西。
注意:由于技术原因,我不能在这里使用 POSIX 信号。
我在一台机器(“工人”)上有几个相同的长期进程。
有时我需要通过命令行工具向每个进程传递控制消息。例子:
这台机器上的每个工人都应该收到一条run-collect-garbage
消息。注意:如果解决方案能以某种方式适用于集群中所有机器上的所有工作人员,那将是完美的,但我可以自己编写这部分。
如果我要存储一些关于运行工作者的信息,这很容易做到。例如,将它们的 PID 保存在已知位置,并在已知路径上打开一个控制 Unix 域套接字,其中某处有 PID。或者打开 TCP 套接字并将主机和端口存储在某处。
但这需要仔细管理存储的信息——例如,如果工作进程突然死亡怎么办?(没有什么是无法管理的,但仍然需要大惊小怪。)此外,信息需要存储在某个地方,从而增加了额外的复杂性。
有没有一种以 PUB/SUB 风格执行此操作的好方法?也就是说,工作人员是订阅者,命令和控制工具是发布者,他们所知道的只是一个“频道 url”,可以说是用来获取消息的。
其他要求:
- 发送到控制通道的消息必须从轮询(选择,无论如何)循环中唤醒工作人员。
- 必须保证消息传递,并且必须到达每一个正在收听的工作人员。
- Worker 应该有一种方法可以在不阻塞的情况下监控消息——最好是通过上面提到的 poll/select/whatever 循环。
- 理想情况下,工作进程在某种意义上应该是“服务器”——他不应该为保持与“通道服务器”(如果有的话)持久连接等而烦恼——或者这应该由框架透明地完成。
linux - ZeroMQ:检查是否有人在 Unix 域套接字后面监听
上下文:Linux (Ubuntu)、C、ZeroMQ
我有一个侦听ipc://
SUB ZeroMQ 套接字(物理上是 Unix 域套接字)的服务器。
我有一个客户端应该连接到套接字,发布它的消息并断开连接。
问题:如果服务器被杀死(或以其他方式异常死亡),套接字文件将保留在原地。如果客户端尝试连接到这个陈旧的套接字,它会阻塞在zmq_term()
.
如果服务器不存在,我需要防止客户端阻塞,但如果服务器处于活动状态但很忙,则保证交付。
假设我无法通过一些外部魔法(例如通过检查 PID 文件)来跟踪服务器的生命周期。
有什么提示吗?
recursion - 龙卷风: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)
发生的事情是回溯发生了一次。然后它似乎堆叠起来,发生了两次,然后是 3 次......无休止。
user-interface - 使用 ZeroMQ 进行跨平台开发?
我们在 Haskell 中有一个大型控制台应用程序,我负责制作跨平台和添加 gui。
要求是:
- 尽可能原生的外观和感觉。
- 适用于 Windows 和 Mac OS X、Linux 的客户端(如果可能)。
- 无需安装单独的运行时。
- 无需网络通信。haskell 代码处理无法通过网络传输的非常敏感的信息。这确实是它不是 Web 应用程序的唯一原因。
现在,这个问题的真正原因是解释我目前正在研究的一种解决方案,并征求我没有想到的原因,这使得这成为一个坏主意。
我的解决方案是原生 gui。Windows 上的 Winforms、Mac OS X 上的 Cocoa 和 Linux 上的 GTK/Glade,它们只处理演示文稿。然后,我将在 Haskell 代码之上编写一个层,将其变成一个响应者,用于使用 ZeroMQ 处理消息以及可能用于来回序列化数据的 protobufs 来接收来自 UI 的消息。因此,本机应用程序将启动,它本身将启动所有魔法发生的守护进程,并来回发送消息。
除了确保守护进程只接受来自启动它的应用程序的连接,以及为高级 gui 元素(我正在考虑表格视图、单元格等)来回提供正确数据的挑战之外,我不看到很多缺点。
我没有想到什么让这成为一个坏主意?
我可能应该提一下,乍一看我打算在所有平台上使用 GTK。问题是,虽然它很接近,并且 GTK 和 Glade 对 Haskell 的支持很好用,但结果看起来并不“正确”。它很接近,但在微妙的方式上不够原生,这使得该解决方案对于碰巧为这项工作编写支票的人来说是不可接受的。
此外,多平台和多语言的 gui 问题也不是问题,所以我不一定要寻找其他方法来解决该问题,除非它简化了与 haskell 代码的互操作的某些内容。