哪个集群NoSQL DB用于消息存储目的?

The*_*uad 7 erlang hbase cassandra nosql riak

还有一个关于NoSQL选择的问题.但是,我还没有找到有人要求这种目的,消息存储......

我有一个Erlang聊天服务器,我已经使用MySQL存储好友列表,以及"JOIN needed"信息.

我想存储消息(用户因为离线而没有收到消息......)并检索它们.

我已经预先选择了NoSQL,我不能使用像MongoDB这样的东西,因为它是面向RAM的范例,并且不能像其他人一样集群.我想我的列表中有3个选项:

  • HBase的
  • 了Riak
  • 卡桑德拉

我知道他们的模型不同,一个使用键/值,另一个使用SuperColumns和co.

到目前为止,由于它是Erlang的稳定客户端库,我对Riak有偏好.

我知道我可以使用Cassandra和Thrift,但是对于Erlang来说似乎不太稳定(我没有得到很好的回报)

我现在对HBase一无所知,只知道它存在并且基于像Cassandra和Riak这样的Dynamo.

所以这就是我需要做的事情:

  • 每个注册用户存储1到X条消息.
  • 获取每个用户存储的消息数.
  • 一次检索用户的所有消息.
  • 一次删除用户的所有消息.
  • 删除所有超过X个月的邮件

现在,我对那些NoSQL DB真的很陌生,我一直都是MySQL爱好者,这就是为什么我问你这个问题,作为一个新手,会有比我更多经验的人帮我选择哪一个更好,并且会让我做我想做的一切,不用太麻烦......

谢谢 !

Dmi*_*lin 7

我不能代表Cassandra或Hbase,但让我谈谈Riak部分.

是的,Riak适合您的场景(我看到有几家公司和社交网络将其用于类似目的).

要实现这一点,您需要简单的Riak Key/Value操作,以及某种索引引擎.您的选择(按优先顺序排列):

  1. CRDT集.如果你的1-N集合大小合理(比方说,每个用户少于50条消息或其他),你可以将子集合的密钥存储在CRDT集数据类型中.

  2. Riak搜索.如果您的集合大小很大,特别是如果您需要在任意字段上搜索对象,则可以使用Riak Search.它在后台旋转Apache Solr,并根据您定义的模式索引对象.它具有非常棒的搜索,聚合和统计,地理空间功能等.

  3. 二级索引.您可以在eLevelDB存储后端上运行Riak ,并启用辅助索引(2i)功能.

运行一些性能测试,选择最快的方法.

就架构而言,我建议使用两个桶(用于您描述的设置):用户存储桶和消息存储桶.

索引消息桶.(通过将搜索索引与其关联,或通过2i存储user_key).这使您可以执行所有必需的操作(并且消息日志不必适合内存):

  • 每个注册用户存储1到X条消息 - 创建用户对象并获取用户密钥后,每个用户存储任意数量的消息很容易,它们将直接写入消息桶,每条消息存储相应的user_key作为二级指标.
  • 获取每个用户存储的消息数量 - 没问题.获取属于用户的消息密钥列表(通过搜索查询,通过检索保存密钥的Set对象,或通过user_key上的2i查询).这使您可以在客户端获得计数.
  • 一次检索用户的所有消息 - 请参阅上一项.获取属于该用户的所有消息的密钥列表(通过Search,Sets或2i),然后通过多次获取每个密钥的值来获取这些密钥的实际消息(所有官方Riak客户端都具有该multiFetch功能,客户端-侧).
  • 立即删除用户的所有消息 - 非常相似.获取用户的消息密钥列表,在客户端发出删除消息密钥.
  • 删除所有超过X个月的邮件 - 您可以在日期添加索引.然后,检索所有超过X个月的消息密钥(通过Search或2i),并为它们发出客户端删除.