繁体   English   中英

大量DB读写操作的设计选项

[英]Design option for Heavy DB Read and Write operation

我有一个将消息发送给数百万用户的系统。

集群中有6个应用程序节点,其中一个公共oracle数据库(RAC)。

在一种用例中,我们必须向用户发送消息,并且一旦传递消息,就必须在db表中更新一个计数器,该计数器的详细信息为no。 发送给用户的邮件数量。 我们也有一个限制,即每天必须仅向用户发送n个消息。

So, 1) Every time before sending the message, we have to read the database to fetch the counter value. 2) Every time after sending the message,we have to update the counter.

任何节点都可以接收任何用户的消息,并且可以并行读取和更新数据库。

现在,我们面临的问题是每个节点每秒不能处理超过1K条消息。 在高峰负载期间,所有线程都在读取或更新数据库。

我们正在考虑引入一种缓存机制来避免DB调用。 但是,由于这里写入数据库的内容也很大,因此我们认为缓存可能不是解决方案。

您是否有更好的建议或体系结构可以通过对DB进行大量读写操作来处理此用例? 如果遇到这种情况,您会提出什么解决方案?

如果您需要更多信息,请告诉我。

一种可能性是完全从数据库中删除应用程序。 而是让他们将作业发布在队列中。 让队列工作者从队列中提取作业,读取/写入数据库,然后将结果发布到某种形式的结果缓存中。 然后,应用程序可以轮询结果缓存以获取其结果。

虽然这不会减少数据库的读/写次数,但可以让您对整个应用程序进行分层。 例如,您可以有一个用于过滤队列中作业的层,将多个计数器更新捆绑在一起,然后让工作人员一次将其全部写入。

另一个明显的可能性是仔细查看您的体系结构并决定是否需要更改数据库技术。 如果您不过度依赖联接,复杂的SQL查询等,请查看键值存储或NoSQL。 看看Cassandra的性能。

这次采访是关于Reddit的体系结构的,它可能会给您一些不错的想法。 (它还显示了我提到的辅助方法/队列方法)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM