【发布时间】: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
是的,这就是我想要的。使用 INDEX 和 specific 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 发送有限制(取决于国家/地区)