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

Erlang 哪个集群NoSQL DB用于存储消息?,erlang,nosql,cassandra,hbase,riak,Erlang,Nosql,Cassandra,Hbase,Riak,另一个问题是选择哪种NoSQL。 然而,我还没有发现有人要求这种类型的目的,信息存储 我制作了一个Erlang聊天服务器,我已经在使用MySQL存储好友列表和“加入所需”信息 我想存储消息(该用户由于脱机而未收到消息…)并检索它们 我已经预先选择了NoSQL,我不能使用MongoDB这样的东西,因为它是面向RAM的范例,也不能像其他集群一样使用。 我想我有三个选择: 糖化血红蛋白 里亚克 卡桑德拉 我知道他们的模型是不同的,一个使用键/值,另一个使用超级列和co 到目前为止,我还是比较喜欢R

另一个问题是选择哪种NoSQL。 然而,我还没有发现有人要求这种类型的目的,信息存储

我制作了一个Erlang聊天服务器,我已经在使用MySQL存储好友列表和“加入所需”信息

我想存储消息(该用户由于脱机而未收到消息…)并检索它们

我已经预先选择了NoSQL,我不能使用MongoDB这样的东西,因为它是面向RAM的范例,也不能像其他集群一样使用。 我想我有三个选择:

  • 糖化血红蛋白
  • 里亚克
  • 卡桑德拉
我知道他们的模型是不同的,一个使用键/值,另一个使用超级列和co

到目前为止,我还是比较喜欢Riak,因为它有稳定的Erlang客户端库

我知道我可以节俭地使用Cassandra,但使用Erlang似乎不太稳定(我没有得到很好的回报)

我现在对HBase一无所知,只知道它的存在,它是基于迪纳摩,比如卡桑德拉和里亚克

所以我需要做的是:

  • 每个注册用户存储1到X条消息
  • 获取每个用户存储的邮件数
  • 一次从用户检索所有消息
  • 一次删除用户的所有邮件
  • 删除所有超过X个月的邮件
现在,我对NoSQL DB真的很陌生,我一直是MySQL的爱好者,这就是为什么我问你这个问题,作为一个新手,有没有比我更有经验的人能帮我选择哪一个更好,让我做任何我想做的事,而不需要太多麻烦


谢谢

我根本不能和Riak说话,但我怀疑你是否选择放弃Mongo。这是相当好的,只要你离开日志关闭,并没有完全饿死它的RAM

我对HBase了解很多,听起来它很容易满足您的需求。根据您的用户数量,这可能是过度使用。它简单地支持每个用户存储许多消息,并具有自动过期写入的功能。取决于您如何构建模式,它可能是原子的,也可能不是原子的,但这对于您的用例来说并不重要


缺点是要正确设置它需要大量的开销。在启动HBase之前,您需要了解Hadoop,运行HDFS,确保您的namenode是可靠的,等等。

我建议使用分布式密钥/值存储,如Riak或Couchbase,并将每个用户的整个消息日志序列化为一个值(二进制erlang术语或JSON/BSON)

因此,对于您的用例,它将如下所示:

  • 每个注册用户存储1到X条消息-当用户联机时,生成一个有状态的gen_server,该服务器从存储中获取并在启动时反序列化整个消息日志,接收新消息,将其附加到日志副本中,在会话结束时终止,序列化更改的日志并将其发送到存储
  • 获取每个用户存储的消息数-获取注销、反序列化、计数;或者将计数存储在单独的k/v对中
  • 一次从用户处检索所有消息-只需将其从存储器中取出即可
  • 一次删除来自用户的所有消息-只需从存储中删除值
  • 删除所有超过X个月的邮件-获取、筛选、放回
明显的限制是消息日志必须放在内存中


若您决定单独存储每条消息,那个么在检索之后,若您希望它们按时间顺序排列,就需要分布式数据库对它们进行排序,所以处理大于内存的数据集几乎并没有帮助。如果需要的话,你最终会得到一些更棘手的方案。

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

是的,Riak适合您的场景(我已经看到一些公司和社交网络将其用于类似的目的)

要实现这一点,您需要普通的Riak键/值操作,以及某种索引引擎。您的选择是(按偏好的大致顺序):

  • CRDT设置。如果您的1-N集合大小是合理的(比如说,每个用户少于50条消息或其他),您可以将子集合的密钥存储在一个数据库中

  • Riak搜索。如果集合大小很大,尤其是需要在任意字段上搜索对象时,可以使用。它在后台启动ApacheSolr,并根据您定义的模式对对象进行索引。它有非常棒的搜索、聚合和统计、地理空间功能等等

  • 二级索引。您可以在上运行Riak,并启用(2i)功能

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

    至于模式,我建议使用两个bucket(对于您描述的设置):一个用户bucket和一个消息bucket

    为消息存储桶编制索引。(通过将搜索索引与其关联,或通过2i存储用户密钥)。这允许您执行所有必需的操作(并且消息日志不必放入内存):

    • 为每个注册用户存储1到X条消息-创建用户对象并获取用户密钥后,为每个用户存储任意数量的消息很容易,它们将直接写入消息存储桶,每条消息将适当的用户密钥存储为辅助索引
    • 获取每个用户存储的邮件数-没问题。获取属于用户的消息密钥列表(通过搜索查询、检索保存密钥的Set对象或通过对user_密钥的2i查询)。这可以让您在客户端获得计数
    • 检索所有消息