好吧,线程安全是有代价的。
ZeroMQ,从最早的版本(您指的是 API 版本 2.1,虽然有超过 4.2+ 的 API 版本在 2018/Q2+ 发布并可用),是在一组共享的值(即Zen-of-Zero )下构建的,它力求以资源友好的方式使事情尽可能高效地发生,并且仅获得合理数量(最好根本没有)延迟。
可能会看到最近在 ZeroMQ 4.2+ 重构中添加线程安全的努力
然而,这并不意味着,这可以免费实现,不是吗?
如果以适当的方式使用适当的工具,没有人会受到伤害,不是吗?
然而,没有人会忽视部署域中将出现哪个 ZeroMQ API 版本的主要不确定性,因此依赖较新 API 版本中可用的功能不需要证明自己对生命周期中遇到的每个(远程)代理都有效-跨度,所以要小心。
无论如何,Akka
注释警告说,原样兼容性已冻结到 API v.2 级别:
当前使用的版本zeromq-scala-bindings
只兼容zeromq 2;不支持zeromq 3 。
又怎样 ?
如果确实需要混合几个不同的事件循环(如上所述),我会选择将任务委托给一组独立操作(无论是同地还是分布式) -实例Context()
,而不是尝试共享任何Socket()
-AccessPoint-级别实例或尝试使用“固定”承诺,只是由外部(同时共存的)非 ZeroMQ 事件循环框架介导。
干净的“无共享”ZeroMQ 设计比尝试处理越来越多的设计工件的艺术更安全、更快速(如果您的领域需要 QA 程序,那么如果要在之前交付设计验证和验证证明,则更多)验收甚至可能会被安排——试着想象一下测试、质量保证/验证证明的成本,这些玩具只是希望有一个确定性、非阻塞、无错误和健壮/弹性的现场操作)
注意:
ZeroMQ Socket()
-instance不是tcp-socket-as-you-know-it。最好在 5 秒内阅读有关ZeroMQ 层次结构中主要概念差异的内容或此处的其他帖子和讨论。
Context()
-实例在它们自己的控制域下有自己的 I/O 线程池,在各自的实例之间也有一个类似“DMA”的映射器,Context
允许Socket()
与各自Context
的(组)I/ O 线程,因此“固定”的全局视图可能不会影响预期的资源映射首选项。
最后但并非最不重要 - Akka-port 特定配置,
与 ZeroMQ 本机 API 默认值不匹配:
#####################################
# Akka ZeroMQ Reference Config File #
#####################################
# This is the reference config file that contains all the default settings.
# Make your edits/overrides in your application.conf.
akka {
zeromq {
# The default timeout for a poll on the actual zeromq socket.
poll-timeout = 100ms
# Timeout for creating a new socket
new-socket-timeout = 5s
socket-dispatcher {
# A zeromq socket needs to be pinned to the thread that created it.
# Changing this value results in weird errors and race conditions within
# zeromq
executor = thread-pool-executor
type = "PinnedDispatcher"
thread-pool-executor.allow-core-timeout = off
}
}
}