可能/推荐在 Go 中编写事件驱动的应用程序?

Possible / Recommended to write event driven app in Go?

我正在设计一个应用程序来管理给定特定规则的 RabbitMQ worker。例如:

我最初想用 Go 编写它,因为它是编译的,我可以简单地将应用程序编译到目标 OS 并将其守护进程。但是,我的概念设计涉及一个循环,该循环每 Y 秒收集一次数据并将其传递给决策引擎。然后引擎会引发事件,其他 goroutine 会监听这些事件以产生或杀死工人。

我找到了 Emission 库可以解决这个问题,但我在某处读到一条评论说它可能不是线程安全的。老实说,我对 Go 和线程编程的了解不足以正确评估这个库是否可以完成我需要的,或者这在 Go 中是否可行。

我可以在 NodeJS 中非常快速地编写它,甚至可以使用 nexe 对其进行编译。但是,我想学习一门新语言,我喜欢 Go 中的目标编译,并且它可以超越 goroutines 本身的多线程。

这可能吗,或者我是不是想把一些本来不应该做的事情硬塞进 Go 中?以不同的方式实现相同的目标还是一起使用不同的语言会更好?

我以前从未见过 Emission 库,它可以非常巧妙地向您的工作人员发送不同的消息。这也可以通过使用通道来实现,这将是一种更灵活的实现方式,但如果您不懂该语言,也会更加麻烦。

我当然会在频道上阅读,但要非常小心,因为通过频道广播并不简单。看看这个例子 (https://rogpeppe.wordpress.com/2009/12/01/concurrent-idioms-1-broadcasting-values-in-go-with-linked-channels/)

总的来说,我会看一下 Tunny (https://github.com/Jeffail/tunny) 来管理工作人员,它已经为您完成了大部分实施工作。

Go 是一种非常适合 i/o 密集型应用程序的语言,尤其是当它们涉及消息传递时。但是,您的用例似乎与 managing RabbitMQ 有关,而不是 messaging。出于这个目的,Go 有相当少的优势使其脱颖而出。

您可能想退后一步,将系统作为一个整体来考虑。有多少需要使用RabbitMQ?如果这是一个悬而未决的问题,您可能会发现轻量级 goroutines 和通道是一个有用的工具。也许,您可以在 Go 程序中直接实现使用 MQ 的系统部分。但是如果您尝试这样做,请记住基本的 CSP 模型是 同步/阻塞消息传递 ,与 MQ 模型完全不同。缓冲、排队、异步操作等是在这种原始行为之上分层的。

如果您真的只是想管理 RabbitMQ,也许可以看看 rabbitmq-http 项目来帮助您下定决心。