【问题标题】:Rails worker written in Javascript?用 Javascript 编写的 Rails 工作者?
【发布时间】:2020-04-16 18:43:55
【问题描述】:

我们有一个 Node 应用程序,一部分 Node 代码作为后台作业运行。这项工作正在使用BullMQ,它是用 JavaScript 编写的,并在后台使用 Redis。

我们正在将一些 Node 应用程序移植到 Rails。但是,我想保留后台作业,按原样用 Node 编写。

有没有可能:

  1. Rails 中的路由、接受请求、安排作业并将其推送到 Redis 队列?
  2. 作业是否由使用 Node/JavaScript 编写的工作人员处理?
  3. 是否让 Rails 监听队列(Websocket 或长轮询)并在完成时将结果发送到浏览器?

换句话说,有没有独立于语言的 Redis / Queue 系统?





                                                       +-------------+
                                                       |             |
                                                       |             |
                                                       | REDIS QUEUE |
                                      +----------------+             |
                                      |                |             |
                                      |                |             +^--+
                                      |                +---------------+ |
     +---------+                      |                       ^        | |
     |         |              +-------v--+                    |        | |
     | browser +--------------+          +--------------------+        | |
     |         <--------------+  Rails   |                             | |
     +---------+              |          |                             | |
                              +----------+                   +---------v----+
                                                             |              |
                                                             |              |
                                                             |  NODE worker |
                                                             |              |
                                                             |              |
                                                             +--------------+




我对 Node 中的 Jobs/Queue 比 Rails 更熟悉。我看到了很多像 SideKick 和 Resque 这样的选项,但似乎工作人员大多是用 Ruby 编写的。

【问题讨论】:

    标签: javascript node.js ruby-on-rails ruby


    【解决方案1】:

    回答三个问题:

    1. Rails 中的路由,接受请求,安排作业并将其推送到 Redis 队列

    是的,当然可以将新作业的属性推送到 redis 队列。您只需构建您的参数(可能将它们序列化为 JSON)并使用 Redis 的 rpush 推送到队列(可以为此使用 Ruby 的 Redis gem)。

    1. 让工作由用 Node/Javascript 编写的工作人员处理

    是的,Redis 基本上没有说编写器需要用与读取器相同的语言编写 - 如果 Rails 应用程序将输入序列化为 JSON,Node 应用程序可以弹出该 JSON 并处理它

    1. 让 Rails 监听队列并在完成时将结果发送到浏览器

    这是比较棘手的部分。要理解的关键是请求是一个同步进程,但整个后台作业系统是异步 - 假设你可以告诉你的控制器sleep并检查循环确认,但这效率低下有两个原因 - 首先,实际上没有必要查询 redis 以确认循环(因为 Redis 具有“订阅”功能),其次,您将浪费一些内存如果你让你的控制器sleep.

    更好的方法是使用 websockets。要安排作业,您可以使用常规控制器或入站 websocket 消息处理程序 - 在任何一种情况下,它都会安排作业并立即响应“作业已入队”。然后,单独在 Rails 应用程序中(在控制器方法之外),您可以设置 Redis 订阅到“作业完成”队列。当它收到一条消息时,它会找到到相关客户端的 websocket 连接,并发送一条 outbound 消息表明 Job 已处理。

    【讨论】:

    • 如果您使用睡眠,您不仅会遇到记忆问题。如果您花很长时间处理请求,您将遇到超时问题,并且您将用完网络线程。
    • 例如在 Bull 中,对 Redis 中的队列的推送、对 Redis 中的队列的订阅都被抽象掉了。它为您提供了两者的界面。但是,当然这都是用 Node.js 编写的。不能从 Rails 调用。同样,Sidekik 是用 Ruby 编写的,不能从 Node 调用
    • 是的,睡眠不是一个很好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    相关资源
    最近更新 更多