【问题标题】:PHP - Use queue and cron job or directly process the request? [closed]PHP - 使用队列和 cron 作业还是直接处理请求? [关闭]
【发布时间】:2017-08-19 11:13:35
【问题描述】:

我正在开发一个巨大的在线短信系统,用户从他们的用户面板发送消息,这些消息转到一个名为messages_queue 的 mysql 表。

然后,系统获取队列行并在 Cronjob 中发送每条消息。当然,以非常快速的方式发送消息很重要。

我在想我直接发送消息(根据用户请求)而不使用队列不是更好吗? (发送消息需要连接外部API)

我在考虑数据库 I/O 时发现了这一点。
不是对数据库有压力吗?

编辑/回答:

我的问题主要是基于意见的问题。顺便说一句,以备将来使用,我将写下我所做的和得到的。在@bansi 的评论中,我尝试为我的表格编制索引,这就是我所看到的:

这是我一开始就得到的,例如:

SELECT * FROM users WHERE parent="admin"
//response:OK
//Time: 3.581s

您知道,3.581 秒的查询时间非常长。然后我试图准确地获取我需要的东西:

SELECT uname FROM users WHERE parent="admin"
//response:OK
//Time: 1.02s

好的,这有点好,但仍然不是我想要的。
所以,我尝试了这个: 索引数据库中的可查询字段并在查询中使用 INDEX:

SELECT uname FROM users USE INDEX(parent) WHERE parent="admin"
//response:OK
//Time: 0.168s

是的,这就是我想要的。使用 INDEXspecific needed fields 大约快 30 倍,这正是我所需要的。

【问题讨论】:

  • 这个问题主要是基于意见的。我认为使用单独的队列会更好,因为您可以轻松处理错误和连接延迟。我不认为在当前的技术状态下,发送短信会导致任何数据库压力,即使您使用的是非常过时的计算机。
  • @bansi 但在ssh 中我使用了htop,我的大部分查询都是SELECT * from messages_queue WHERE active=1 AND sendflag=0,我的平均服务器负载约为3.0,而我使用的是一个好的系统作为服务器。我认为这不是通常的情况。
  • 据我所知,cron 最小间隔为 1 分钟,每分钟查询一次不会使数据库超载。注意:你应该在下一个工作开始之前完成你的工作(或有一些逻辑),以避免重复。
  • @bansi 是的,最小间隔为 1 分钟,最大执行时间约为 30 秒,但服务器超载,我不知道是什么造成了这种超载。注意:这不仅仅是 1 个 cron 作业文件,它是大约 30 页从多个号码发送并获取消息传递状态...
  • 您可能应该检查 SMS 发送 API 资源的使用情况。顺便说一句,您要发送多少条短信/分钟?注意:SMS 发送有限制(取决于国家/地区)

标签: php mysql cron queue


【解决方案1】:

队列的好处是能够给用户更快的响应,所以虽然SMS没有更快的发送,但是用户会觉得系统更快,因为他们点击“发送”并得到反馈立即地。您也许可以尝试将队列移出数据库,移至专用队列处理系统,例如 RabbitMQ。

【讨论】:

  • 这是一个很好的答案,但这不是我的答案。还是谢谢。
【解决方案2】:

好吧,我之前使用 MySQL 来排队,及时,如果你不清理表,它会变得非常慢,你可以使用它但是你总是有清理执行的行...

但是如果你正在寻找一个真正的队列系统,我会推荐 RabbitMQ,它很简单,而且你可以用它做很多事情。

【讨论】:

  • 我在 RabbitMQ 方面没有那么丰富的经验,这就是我不使用它的原因。 (系统之前是基于MYSQL队列开发的,这是另一个原因。)无论如何,我会认真对待有一个干净的表。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 2018-01-20
  • 2020-06-06
  • 2014-11-04
  • 2012-07-04
  • 2023-03-10
相关资源
最近更新 更多