我有一些代码可以生成大量应该存储在数据库中的数据。问题是数据库无法与生成的数据保持一致。所以我想知道某种排队机制是否会对这种情况有所帮助 - 我特别想在RabiitMQ中,是否可以将数据存储在队列中,直到某些消费者从中获取数据并将其推送到数据库。 此外,我并不特别感兴趣的是,数据是否会进入数据库,因为很快就会更新相同的数据。
答案 0 :(得分:1)
@hyperboreean 它可能听起来有点油腻,但你真正需要的是一个缓存,如Redis或MemcacheD?
从技术上讲,您可以将RabbitMQ用于消费者更新数据库,但是您需要实施“队列清理”机制,否则只要您的输入速率仍然超过数据库可以处理的速度,您的队列就会变得越来越大。随着队列的增长,其中的数据变得陈旧 - 这意味着刚刚提交的更新仍然排在队列中。把它想象成一个有一个检查器的商店。当然你可以形成单独的线,但这只意味着你有多条长线,但仍然有一个检查器。您仍受限于检查员可以处理您的客户的费率。
从简短的描述中可以看出,您的数据实际上是瞬态数据,而缓存系统(或其他类似NoSQL的安排)可能更适合。如果确实需要最终保留数据,则可以使用单独的进程从缓存机制中提取当前数据并将其加载到数据库中。然后,您将受限于提取它所需的时间与实际将数据加载到数据库中的频率。
答案 1 :(得分:1)
数据库应该非常快速地处理数据插入,没有锁定机制,因为插入是关于商店中尚不存在的数据。如果您正在处理数据插入并且您对数据库的序列化是一个瓶颈,那么与RabbitMQ相关的任何问题仍然存在,因为数据库插入应该执行更快比RabbitMQ的出站消息传递。在这种情况下,RabbitMQ无法解决您的问题。另一方面,数据更新将锁定更新行(一般情况下),并且您会遇到锁定和等待的并发问题。总的来说,试着理解为什么你的数据库持久性是一个瓶颈。
最终,如果您的数据存储是NOSQL,那么它可能不是正在执行的写入,在这种情况下,您可以分析更快地接收数据的内容(NoSQL与RabbitMQ)。
如果您在多个线程上拥有数据生成器,那么您有一个并发问题要写入持久性存储。在这种情况下,RAbbitMQ应该更好地处理持久性存储的并发性,因为它是为高并发性而设计的。这取决于您使用的数据存储。