在 Python/Django 堆栈上,我们习惯于使用 Celery 和 RabbitMQ。一切都很容易完成。
然而,当我们尝试在 Clojure 领域做同样的事情时,我们能得到的是 Langhour。在我们当前的幼稚实现中,我们有一个工作系统,它具有三个核心部分。
- 发布者模块
- 订户模块
- 任务模块
我们可以在任何节点上以发布者或订阅者模式启动系统。它们连接到 RabbitMQ 服务器。
他们共享一个worker_queue。
我们正在做的是在任务模块中创建任务,然后当我们想在订阅者上运行任务时。我们以 EDN 格式向该方法发送一个表达式调用,然后订阅者对其进行解码并使用 eval 运行实际任务。
现在使用 eval 安全吗?我们没有运行用户或任何第三方系统生成的表达式。最初我们计划使用 JSON 来发送有效负载消息,但后来 EDN 给了我们更多的灵活性,它就像一个魅力,到目前为止。
还有更好的方法吗?