0

据我从文档中可以看出,ZeroMQ 套接字不应该从不同的线程中使用(例如读取/写入)。

这反过来又阻止了我在默认调度程序上运行的 Akka Actor 中使用 ZMQ 套接字(不能保证哪个线程将执行我的receive方法)。

使用PinnedDispatcher 是否允许我在 Actor 内安全地使用此类套接字,前提是我注意不要阻塞(至少不要阻塞过多的时间)?

这个调度器为每个使用它的actor指定一个唯一的线程;即每个actor都有自己的线程池,池中只有一个线程

通过:https ://doc.akka.io/docs/akka/2.5/dispatchers.html#types-of-dispatchers

我正在使用 JeroMQ 0.4.0 和 Akka 2.5。我意识到 Akka 曾经有一个 ZeroMQ 扩展,但似乎大部分都被放弃了。

4

1 回答 1

-1

好吧,线程安全是有代价的。

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
    }
  }
}
于 2018-04-11T15:45:11.400 回答