可能/推荐在 Go 中编写事件驱动的应用程序?
Possible / Recommended to write event driven app in Go?
我正在设计一个应用程序来管理给定特定规则的 RabbitMQ worker。例如:
- 保持最低数量的工人
- 如果队列增长超过 M 个任务,则生成最多 N 个最大数量的工人
- 杀死超过 X 分钟的工人
我最初想用 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 项目来帮助您下定决心。
我正在设计一个应用程序来管理给定特定规则的 RabbitMQ worker。例如:
- 保持最低数量的工人
- 如果队列增长超过 M 个任务,则生成最多 N 个最大数量的工人
- 杀死超过 X 分钟的工人
我最初想用 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 项目来帮助您下定决心。