Erlang 哪个集群NoSQL DB用于存储消息?
另一个问题是选择哪种NoSQL。 然而,我还没有发现有人要求这种类型的目的,信息存储 我制作了一个Erlang聊天服务器,我已经在使用MySQL存储好友列表和“加入所需”信息 我想存储消息(该用户由于脱机而未收到消息…)并检索它们 我已经预先选择了NoSQL,我不能使用MongoDB这样的东西,因为它是面向RAM的范例,也不能像其他集群一样使用。 我想我有三个选择:Erlang 哪个集群NoSQL DB用于存储消息?,erlang,nosql,cassandra,hbase,riak,Erlang,Nosql,Cassandra,Hbase,Riak,另一个问题是选择哪种NoSQL。 然而,我还没有发现有人要求这种类型的目的,信息存储 我制作了一个Erlang聊天服务器,我已经在使用MySQL存储好友列表和“加入所需”信息 我想存储消息(该用户由于脱机而未收到消息…)并检索它们 我已经预先选择了NoSQL,我不能使用MongoDB这样的东西,因为它是面向RAM的范例,也不能像其他集群一样使用。 我想我有三个选择: 糖化血红蛋白 里亚克 卡桑德拉 我知道他们的模型是不同的,一个使用键/值,另一个使用超级列和co 到目前为止,我还是比较喜欢R
- 糖化血红蛋白
- 里亚克
- 卡桑德拉
- 每个注册用户存储1到X条消息
- 获取每个用户存储的邮件数
- 一次从用户检索所有消息
- 一次删除用户的所有邮件
- 删除所有超过X个月的邮件
谢谢 我根本不能和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键/值操作,以及某种索引引擎。您的选择是(按偏好的大致顺序):
- 为每个注册用户存储1到X条消息-创建用户对象并获取用户密钥后,为每个用户存储任意数量的消息很容易,它们将直接写入消息存储桶,每条消息将适当的用户密钥存储为辅助索引
- 获取每个用户存储的邮件数-没问题。获取属于用户的消息密钥列表(通过搜索查询、检索保存密钥的Set对象或通过对user_密钥的2i查询)。这可以让您在客户端获得计数
- 检索所有消息