模块 8 作业
【每个消息队列一张表,主要原因如下】
所有消息放一张表时不同消费者需要用 where 条件筛选队列名称字段,而队列名称只会是几个固定取值,区分度很低,就算是加了索引查询效率也不高;
不同队列的消费者分别读不同的表,相比所有消费者都读一张表性能更好,MySQL 压力也更小;
所有消息放一张表的话,有处理得慢的消息就会阻塞其它快的队列;
如果有的队列消息量增长比较快,则可以针对该队列扩展多张表甚至多个库;如果都放一张表则所有其它队列也必须跟着扩展,有一定的资源浪费。
设计方案
表名:队列名作为表名
字段设计如下表所示。生产者写入消息时利用数据库自动生成的自增 id 作为消息 id,消息状态 status 设置为 0;消费者读取消息时定位到 status 为 0 的最大 id 记录,修改状态 status 为 1 并读取该记录的消息内容进行消费。
消息 id 作为主键,status 字段上建索引,因为消费者需要根据 status 字段查找记录。
评论