【发布时间】:2014-03-23 16:20:42
【问题描述】:
我有一个 mysql 表被用作消息队列:
id | message_text
这是一个 InnoDB 表,id 字段是一个自增整数字段。
生产者应用有多个线程,它们执行如下插入操作:
insert into my_table(message_text) values('the text');
消费者应用每五秒运行一次。它选择 50 条记录,然后按行 ID 删除每条记录:
rows = select * from my_table limit 50;
for (row : rows) {
delete from my_table where id = row.id;
}
消费者应用似乎没有看到所有行。只有一个生产者应用程序实例在运行,它在单个线程中进行选择。生产者应用程序打印以控制台它插入的所有消息,消费者应用程序还打印它处理的每一行,但它缺少行。
我认为既然我是按行 ID 明确删除的,我不会遇到问题,但似乎我肯定会在某处删除行。
谢谢
【问题讨论】:
-
生产者创建消息的速度有多快?不会是消费者根本赶不上吗?
-
一点也不快,比如每秒 1 个。
-
好吧,如果你只删除“已经看到”的行的 id,那么消费者应该在下一次运行中看到它们……除非它们“从未见过”,因为有太多.您只是选择没有应用任何
ORDER BY的行吗?这会让消费者看到what的when非常随机……所以我建议包括订购,看看你会得到什么结果。 -
是的,这是我的想法,它们最终应该被消费者看到。但我关闭了生产者,让消费者继续前进。消费者不知何故从未看到某些行。如果这在理论上可行,那么我一定是在某个地方引入了问题。
-
如果没有顺序,我相信它们会按主键的顺序出现,我猜这甚至是预期的行为。但是添加订单肯定不会受到伤害