Heroku上组件之间的同步通信

时间:2017-12-12 17:33:18

标签: java heroku architecture client-server synchronous

我在Java中为Slack创建一个聊天机器人,如下所示:

enter image description here

要了解此图表,请考虑" Bot"作为Slack用户进行处理,而不是人类,是计算机程序。

有两个组件,聊天机器人本身和语法分析器。解析器需要很长时间才能启动,所以我不能为chatbot处理的每条消息启动解析器。相反,解析器必须始终运行并响应来自聊天机器人的查询。

我想将所有组件部署到Heroku。据我所知,部署这些组件有三种选择:

  1. 同一个应用程序中同一个dyno上的Bot和解析器
  2. 同一个应用程序中单独的dynos上的Bot和解析器
  3. Bot和解析器在不同的应用程序中
  4. 问题是如何最好地实现两个组件之间的同步双向通信。

    到目前为止,我查看了以下可能的解决方案:

    选项1:同一dyno上的bot和解析器

    • 使用如here所示的命名管道:这是一个容易出错且不便携的解决方案
    • TCP套接字(将解析器设置为服务器,将bot设置为客户端并通过localhost和某个端口进行通信):这在AWS EC2上工作(通过AWS Elastic Beanstalk),但是,它似乎不容易工作在Heroku上(如here所述),我想从AWS迁移到Heroku

    选项2:同一应用程序中不同dynos上的bot和解析器

    • TCP套接字:它不是解决方案,因为在不同的dynos上运行的进程无法相互通信,因为文档here
    • 第三方Heroku消息传递和排队插件:使用其中一个add-ons,例如,IronMQ

    选项3:不同应用程序中的bot和解析器

    • 将解析器作为web进程运行,并公开chatbot可以访问的REST接口
    • 第三方Heroku消息传递和排队插件:这应该与选项2中的方式相同

    怎么办?

    我更愿意将组件分离,因此我倾向于选项2和选项3。

    消息排队插件肯定会有效,但它们是否都针对异步通信?因为我只需要同步通信。如果对解析器的请求立即返回,则没有任何好处,因为机器人无论如何只能在解析器的结果可用时才回复消息。因此,异步通信在这里可能有点过头了。

    我错过了任何可能的解决方案吗?对于这个用例,什么是强大而高效的架构?

0 个答案:

没有答案