【问题标题】:ZMQ Java - Best practice to clean when exitingZMQ Java - 退出时清理的最佳实践
【发布时间】:2017-09-26 00:25:26
【问题描述】:

在 ZMQ zguide 中,他们 advice 总是在任务结束时进行清理。 我对最佳实践有点困惑。

第一个

  • ...即使关闭所有套接字,zmq_ctx_destroy() 默认情况下会一直等待
  • ...最后,销毁上下文
  • ... 这将导致附加线程中的任何阻塞接收或轮询或发送返回错误。捕获该错误,然后设置 linger on,并关闭该线程中的套接字,

Q1:那么我需要在销毁上下文之前关闭所有套接字吗?

Q2:那么我需要销毁上下文吗?

查看 context.destroy() 我看到它在每个套接字上调用 linger 和 close。

Q3:我应该如何终止我的 ZMQ 资源?

编辑 如果我查看 jeromq 代码 - 我在 ZContext.destroy 内部看到了对
destroySocket(每个套接字)的调用

s.setLinger( linger );
s.close();
sockets.remove( s );

然后它甚至调用sockets.clear();context.term();

Q4:这就够了吗?

【问题讨论】:

  • 为什么你会同时在 zeromq 邮件列表上问同样的问题。恕我直言,这不好。

标签: java zeromq


【解决方案1】:

A1:是的,但是...

A2:是的,但是...

A3:遵循 ZeroMQ 最佳实践,不要仅仅依赖于语言绑定

A4:参考。 A3

“最佳实践”的动机是什么?

首先,大家应该意识到,ZeroMQ 有一套特定的内部架构原则,任何人都不得有意或无意违反。

也就是说,人们可能也意识到,不同的语言绑定(它不是 ZeroMQ,而是与内部架构规则外部关联的一些其他代码包装器)可能在协调优雅终止方面存在问题(并且一些包装器隐藏了这一点在引擎盖下,这样用户就不会知道那里会发生什么)。

无休止地将.bind()-s 挂在本地主机端口和陷入死锁的线程只是资源释放和终止实践不佳可能面临的一些麻烦。

什么是 ZeroMQ 的经验法则?

  1. 在所有 ZMQ 套接字实例上强制执行 非阻塞 .close()
  2. 最后强制.term() ZMQ-context 实例

广告 1) 非阻塞表示,.setsockopt() 参数中的一个必须适当注意,类似于ZMQ_LINGER,以避免死锁(s ) 关于让 ZMQ-socket 原型在预期中无休止地等待,对方可能仍有一些消息要接收,所以在这一步要小心和有条不紊。在调用.close()之前设置所有安全退出参数。否则你会失去控制进入阻塞模式。

【讨论】:

  • 没有简单的答案要说 “是的,伙计,这就够了。” 尽管这听起来像是所罗门的智慧,但人们可能只会从阅读 Pieter HINTJEN 的书中受益“ Code Connected, Vol. 1”(以 PDF 格式提供)。 另外我热烈建议任何打算在分布式系统中认真工作的人也仔细阅读 Martin SUSTRIK(ZeroMQ 的共同之父)关于低级 ZeroMQ 中仍然存在的问题的帖子架构决策。 阅读 >>> nanomsg.org/documentation-zeromq.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2013-01-23
  • 2019-08-04
  • 1970-01-01
  • 2010-12-19
  • 1970-01-01
相关资源
最近更新 更多