Laravel 队列、Beanstalkd 与数据库,有何区别?

Laravel Queue, Beanstalkd vs Database, what are the differences?

使用 Beanstalkd 和队列数据库驱动程序有很大区别吗?

优点和缺点是什么?数据库队列似乎更容易设置和 运行,使用它我应该知道什么?

文档中没有关于它的真正解释。

使用数据库作为队列可以更简单地设置并且可能更容易在开发机器上进行测试。但是 运行 在生产中将数据库作为队列可能不是一个好主意;特别是在高流量场景中。尽管数据库可能不是排队的正确工具,但让我们看看使用它的优缺点。

优点:

  • 更容易设置
  • 如果您使用相同的数据库,可能会减少应用程序中移动部件的数量

缺点:

  • 对于大量的读写,必须有一些机制来锁定行和更新索引等。
  • 轮询工作人员还会锁定一个索引以便对其进行处理并使用作业的最终状态更新该行。
  • 在这种情况下,对数据库的写入可能会排队,并且需要更长的时间才能执行。

SQS、Beanstalkd、RabbitMQ 等消息队列就是为处理这些场景而构建的。因为他们只关心正在存储和处理的消息,所以他们不必担心锁定和事务日志记录(这是数据库所需要的)。向系统添加消息队列将有助于更轻松地扩展。此外,它还可以让数据库进行实际的事务处理,而不必担心消息传递,从而让数据库喘口气。

我在我的一台生产服务器上做了一些测试。

场景:Insert a new visitor tracking info (ip, city, state, country, lat, lng, user-agent, etc)(要插入新条目,您需要确保IP最近没有访问过24 小时),因此它也有一个 select 查询。

(注:table大小以百万为单位,实例为micro,看看最坏情况是什么)

这是我得到的数字:

|--------------|----------|----------|
| Queue Driver |  TTFB    | Blocking |
|--------------|----------|----------|
| Sync         | 2.130sec | YES      |
| Database     | 0.430sec | NO       |
| AWS SQS      | 0.855sec | NO       |
|--------------|----------|----------|
  1. 显然,sync 是最糟糕的选择,因为用户在开始接收任何数据之前必须坐在那里 2.3 秒。
  2. database 有最好的结果,但如前所述,对于高访问者数量可能不是最佳解决方案。此外,你不应该忘记还有一个 insert 被制作成 jobs table.
  3. AWS SQS 令我惊讶的是比使用数据库慢。我猜这是因为使用 database 你已经在你的连接池中建立了到数据库的连接,但是 SQS 每次都必须建立一个 TLS 连接。因此,额外的 300-400 毫秒。

老实说,我不认为 SQS 很难设置(只需遵循 guide)。我认为决定取决于您的访客数量。