数据库设计用于高容量聊天消息

时间:2016-01-18 05:22:32

标签: chat couchbase ott nosql

我是Couchbase的新手, 我想了解如何建模存储来自Couchbase中典型IM应用程序的数十亿条聊天消息。在Couchbase中对此进行建模的正确方法是什么?假设在10000条消息/秒上有10000条新消息/秒插入和40000条更新。假设,一对一聊天作为主要用例,尽管每个人都会有很多好友 - 非常像Whatsapp

谢谢,感谢所有反馈。

**更新:**

感谢您的回复,这是我的数据库设计:

enter image description here

Couchbase上的示例数据存储(文档存储):

文档用户

123_user => {" ID" :123," friend_ids" :[456,789,...],"会话":" 123asdcas123123qsd"}

文档历史消息(channel_name = userId1 +" -to - " + userId2)

123-to-456_history => {" channel_name":" 123-to-456"," message_ids" => [" 545_message,999_message,...."]}

记录消息

545_message => {" ID" :545,client_id:4143413,from_uid:123," to_uid" :456,"身体" :" Hello world"," create_time" :1243124124,"州" :1}

此处存在问题,当历史消息上的 message_ids 字段存储数百万或十亿条消息ID时,这在读取和写入消息历史记录时确实是一个大问题。 谁能给我一个解决这个问题的方法呢?

1 个答案:

答案 0 :(得分:0)

首先,我们需要将CouchBase放在一边。关键问题是如何对这个应用场景进行建模,然后我们知道CouchBase是否是您的最佳选择。

一对一聊天应用程序可以将每对聊天用作主键。

例如,Bob-to-Jack,他们聊天:
    1. “你好!”;
    “休息一下?”;     “不,我现在很忙。”;     ......

您将使用主键“Bob-Jack”插入一条新记录,并将值“hello; go for rest; no,....”。

如果对话停止,此记录将停止增长并存储以备将来使用。

如果在第二天,两个人再次聊天,你的应用程序将通过键“Bob-Jack”获取此记录,显示他们的昨天对话(值),并通过将新的聊天内容添加到端。

值的长度增加,如果超过某个阈值,则将其分成两个记录。由于许多数据库系统对一条记录有一个大小限制。

一个人有很多好友,所以在现实世界中有数十亿对(键),每对都有很长的对话(价值)。 No-sql解决方案是这个数据量的不错选择。

然后你可能知道CouchBase能否完成这项任务。我认为这是可以的,但不是唯一的选择。