【问题标题】:Serving multiple users at once with a Python Slack bot使用 Python Slack 机器人同时为多个用户提供服务
【发布时间】:2016-04-27 03:45:16
【问题描述】:

我有一个用 Python 编写的机器人,在 Amazon EC2 上运行,并以 Django 作为框架。该机器人的最终目标是同时维持与同一个 Slack 团队中的多个用户的对话。据我了解,亚马逊将处理 Slack 团队之间的负载,但我试图弄清楚如何在单个 Slack 中管理负载。

现在,我的机器人正忙于等待单个用户响应。我一直在对此进行一些研究——Celery 是适合这项工作的工具吗?我应该将每个对话分成一个单独的线程/任务,还是让调度员处理新消息? Slack 有没有办法发送中断,还是我被 while 循环卡住了?

感谢您的帮助/指导!我对此很陌生。

编辑:我设法通过实现与每个用户相关的“对话”对象列表来解决这个问题。这些对象保存每个对话的状态,以便机器人可以在用户再次发消息时从中断的地方继续。

【问题讨论】:

  • 看起来你需要使用异步框架来完成这个任务。查看Tornado

标签: python django amazon-ec2 celery slack-api


【解决方案1】:

假设:

  • 您使用的是来自 slack 的传出 webhook,而不是实时消息传递 API
  • 您不会尝试在需要维护每个问题和答案之间的状态的情况下进行某种多问答响应。

跳过所有 Django 内容,只使用 AWS Lambda 来响应用户请求。这只适用于相当简单的“MyBot:do_something_for_me”风格的东西,但它对我们来说效果很好。由于没有 ec2、没有 rds、易于部署等,因此管理起来也容易得多。只需确保为每个 Lambda 请求设置合理的时间限制。根据我的经验,通常 3 秒就足够了,除非你有一个更大的脚本。

如果你真的真的必须保持所有这些状态,那么你最好在 Flask 中编写一些快速的东西,而不是完成 django 的所有设置。然后,您将不得不处理任何 Web 服务所需的所有部署、自动缩放、备份繁琐,但如果您需要它,那么您需要它 =)

【讨论】:

  • 作为对此的快速跟进,从您的问题来看,听起来您正在使用 RTM API。是否可以重新设计您所做的工作以仅使用 webhook?如果是这样,那就更容易处理了。如果没有,那么正如@xyres 所说,您将需要一个异步框架。也许深入了解github.com/slackhq/python-rtmbot
  • 嗯...所以我的机器人通过实时消息与用户进行了短暂的交互,然后它成为两个 Slack 之间的中继,通过 Webhook 来回发送消息。您认为可以将 AWS Lambda 与我已经设置的内容结合使用吗? Django 已启动并正在运行,只是当两个用户(现在的测试用户)同时与机器人通信时,电线被交叉。感谢您的帮助!
  • 您也许可以使用斜杠命令 api 通过 webhook 将所有内容发送出去。在您的测试环境中,您正在使用 gunicorn 服务,对吗?如果您只是想将两个不同的松弛团队代理在一起,是否有适合您的现有集成(例如sameroom.io)?如果您需要像这样的状态 Lambda 中继,在这种情况下可能不适合花费大量时间来设置数据库连接和拆卸。
  • 仍在解决此问题(可能已找到功能性解决方法),但可以肯定。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2021-06-09
  • 2019-08-09
  • 2019-10-28
  • 1970-01-01
  • 2017-03-18
  • 2016-03-03
  • 1970-01-01
  • 2018-03-10
相关资源
最近更新 更多