如何在beantalk worker中批量读取sqs消息

Posted

技术标签:

【中文标题】如何在beantalk worker中批量读取sqs消息【英文标题】:How to batch read sqs messages inside beanstalk worker 【发布时间】:2018-06-15 11:26:56 【问题描述】:

我们在弹性 beanstalk 上运行的 Web 应用程序将传入请求的活动记录到数据库中。我们希望将 dB 记录与请求处理路径分离,以便加快响应时间。我们决定使用 sqs 队列和 beanstalk worker。想法是将日志事件排队到 sqs,让工作人员接收事件并让它记录到 dB。

现在需要优化 dB 记录操作并避免为队列中的每条消息创建一个连接。据我了解,sqs 守护进程会为每条消息调用工作人员,有没有办法让守护进程批量发送消息,以便只有一条消息,并且它的正文包含所有消息的内容?

或者我们是否需要使用辅助队列或编写自定义 sqs 消息聚合器来处理队列中的 n 条消息,然后将一批消息发送到另一个队列,然后将其写入 dB 一次?

我们正在使用 phpmysql

【问题讨论】:

【参考方案1】:

根据我的经验,默认情况下您不能。守护程序为每条消息调用您的应用程序。 您可以做的可能是在文件中本地缓存消息(假设您使用的是单个实例而不是自动缩放一个)(锁定系统以进行多处理),然后使用 ELB cronjob 的调度从文件中检索信息然后每隔一定时间进行一次数据库操作。因此,您可以批量执行该数据库操作。

如果您想对多个实例使用 Auto Scaling,您可能需要使用另一个消息传递,这与另一个选项相比是一种浪费。此选项是您使用基于 aws sdk 的代码编写自己的代码,以批量从 SQS 接收/删除,然后更新您的数据库。

【讨论】:

以上是关于如何在beantalk worker中批量读取sqs消息的主要内容,如果未能解决你的问题,请参考以下文章

弹性 beantalk 中的 celery worker 出错(使用 django 和 SQS)[ImportError:curl 客户端需要 pycurl 库。]

在弹性 beantalk 环境中读取数据库配置详细信息的 API 是啥?

单独的环境配置弹性beantalk

使用 crontab 在弹性 beanstalk worker 实例上运行 django 管理命令

如何在自动缩放的弹性 beantalk 实例中更新文件

如何使用弹性 beantalk 中的 express.js 进行反应构建?