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

标签 erlang nosql cassandra hbase riak

关于选择哪种 NoSQL 的另一个问题。
但是,我还没有发现有人要求这种类型的目的,消息存储......

我有一个 Erlang 聊天服务器,我已经在使用 MySQL 来存储 friend 列表和“需要加入”信息。

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

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

  • Hbase
  • Riak
  • Cassandra

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

    到目前为止,我偏爱 Riak,因为它是 Erlang 的稳定客户端库。

    我知道我可以将 Cassandra 与 Thrift 一起使用,但它似乎与 Erlang 不太稳定(我没有得到很好的返回)

    我现在对 HBase 一无所知,只知道它存在并且基于 Cassandra 和 Riak 之类的 Dynamo。

    所以这是我需要做的:
  • 每个注册用户可存储 1 到 X 条消息。
  • 获取每个用户存储的消息数。
  • 一次检索用户的所有消息。
  • 一次删除来自用户的所有消息。
  • 删除所有超过 X 个月的邮件

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

    谢谢 !

    最佳答案

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

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

    要实现这一点,您需要简单的 Riak Key/Value 操作,以及某种索引引擎。您的选择是(按偏好的粗略顺序):

  • CRDT 套装 .如果您的 1-N 集合大小合理(假设每个用户的消息少于 50 条或其他),您可以将子集合的键存储在 CRDT Set Data Type 中。 .
  • Riak搜索 .如果你的集合很大,特别是如果你需要在任意字段上搜索你的对象,你可以使用 Riak Search .它在后台启动 Apache Solr,并根据您定义的模式索引您的对象。它具有非常棒的搜索、聚合和统计、地理空间功能等。
  • 二级索引 .您可以在 eLevelDB storage back end 之上运行 Riak ,并启用 Secondary Index (2i) 功能。

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

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

    索引消息桶。 (通过将搜索索引与其关联,或通过 2i 存储 user_key)。这使您可以执行所有必需的操作(并且消息日志不必放入内存中):
  • 每个注册用户存储 1 到 X 条消息 - 一旦你创建了一个 User 对象并获得了一个用户 key ,为每个用户存储任意数量的消息就很容易了,它们将直接写入消息桶,每条消息存储适当的 user_key 作为二级索引。
  • 获取每个用户存储的消息数 - 没问题。获取属于用户的消息键列表(通过搜索查询,通过检索保存键的 Set 对象,或通过对 user_key 的 2i 查询)。这使您可以在客户端获得计数。
  • 一次检索来自用户的所有消息 - 请参阅上一项。获取属于用户的所有消息的键列表(通过 Search、Sets 或 2i),然后通过多次获取每个键的值来获取这些键的实际消息(所有官方 Riak 客户端都有 multiFetch能力,客户端)。
  • 一次删除一个用户的所有消息 - 非常相似。获取用户的消息键列表,在客户端向他们发出删除。
  • 删除所有超过 X 个月的邮件 - 您可以在日期上添加索引。然后,检索所有超过 X 个月的消息 key (通过 Search 或 2i),并为它们发出客户端删除。
  • 关于erlang - 哪个集群 NoSQL DB 用于消息存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10286080/

    相关文章:

    java - Redis 复制问题

    java - 如何使用 Cassandra Java 驱动程序访问带有嵌套映射的列表

    python - 多节点 Cassandra 集群和不一致的客户端读取请求

    Erlang:如何禁用 "crash dump"和 "core dump"生成?

    linux - Erlang 脚本中的大小写表达式

    sql - Cassandra 真的为大型项目的生产环境做好准备并且足够成熟吗?

    sql - 如何存储 15 x 1 亿条 32 字节记录以进行顺序访问?

    database - Cassandra 数据中心复制与 Couchbase 数据中心复制

    apache-kafka - Erlang 的行为真的有点像类继承吗?

    rabbitmq - 无法部署最新的rabbitmq?