【问题标题】:what is the difference between pub/sub DB and a client side programmed one?pub/sub 数据库和客户端编程数据库有什么区别?
【发布时间】:2012-09-17 21:48:22
【问题描述】:

我有两个NoSQL DBMSMongoDBRedis

Redis 有著名的PubSubMongoDB 有最接近RDBMS 的逻辑,这是从SQLNOSQL 的最佳转换,因为MongoDB 在@987654334 中使用@DictionariesLists,例如,如果用户添加或删除产品,则更改的是 list 的长度,因此,此处可以将代码写为 notificator

那么在这里使用Redis 有什么好处呢?

【问题讨论】:

  • 这里的通知者是什么意思?
  • mongodb没有Triggers?所以据我了解,pubsub 与 pubsub 有关吗?
  • 不,MongoDB 没有触发器或类似机制来通知客户端更改。
  • @RostyslavDzinko:MongoDB 确实支持 tailable cursors 对有上限的集合,例如复制 oplog,有些人将其用于 pub/sub with MongoDBcustom triggers
  • @Stennie,说可尾游标是 pub/sub 替代品的限制太多,尽管我同意它可以应用于狭窄的任务领域。

标签: python mongodb redis publish-subscribe


【解决方案1】:

我在 ops 日志上使用了 Redis pub-sub 和 Mongodb 可尾游标(这是一个有上限的集合 - 请参阅 http://denormalised.com/home/mongodb-pub-sub-using-the-replication-oplog.html 和 http://blog.mongodb.org/post/29495793738/pubsub-with-mongodb)来创建自己的游标。主要区别在于您是否要使用 Mongo 为发布订阅构建自己的逻辑。从表面上看,pub-sub 似乎很简单,但与任何事情一样,它有很多你必须编程的边缘情况。 Redis 的 pub-sub 已经为您完成了大部分管道工作,因此您可以担心高级编码问题,并将低级内容留给已经解决问题的系统。

Mongo 对 Redis 的最大胜利在于,您可以更好地控制如何构建 pub-sub,因此如果您有特殊需求,它可能是更好的选择。例如,使用 Redis(开箱即用),如果客户端断开连接,然后在 10 分钟后重新连接,则在这中间的几分钟内它会丢失消息,并且无法取回它们。使用 Mongo,客户端可以返回并获取这些消息(需要注意的是它必须从头到尾读取整个封顶集合) - 请记住,您必须跟踪传递给每个客户端的最后一条消息,等等。有Redis 的变通方法,以便它可以实现这一点 - 请参阅 Redis Pub/Sub with Reliability 作为一个示例。

如果您需要速度并支持大量客户端和大量订阅渠道,那么 Redis 是您的最佳选择。在我提到的实现中,Redis 是迄今为止最快的,能够处理最多的客户端。当然,这可能反映了我们的 Pub-Sub 实现存在问题,而不是反映 mongo 的一般性能。虽然,我们确实遇到了 Mongo 中全局写入锁定的问题,该问题已在最新版本(2.2?)中得到缓解。

总结一下,如果您需要专门的东西,Mongo 可能是您的正确选择。但是,如果您想要直接的消息传递,即开箱即用,可以处理大量负载,我不会尝试重新发明轮子,而是使用 Redis。

【讨论】:

  • 谢谢您的回复,如果我都用了,请问如何从MongoDB访问Redis,还是需要复制一些数据?
  • 这在很大程度上取决于您的应用程序以及您如何设计架构以及数据需要传输的方向。如果不深入了解您的应用程序,甚至不可能给出一个有价值的简单答案。我建议您打开另一个 q 详细说明您的确切规格。您不能直接在两者之间移动数据。最明显的方法是 a) 通过您的应用层 - 当您将数据保存在一个地方时,您将其保存在另一个地方,或者 b) 通过 RabbitMQ/ActiveMQ 等队列机制/消息总线。
  • 我只需要通知注册到卖家的客户他有新产品要出售。
  • 如果您要做的是将主要信息存储在 Mongo 中,然后将 pub-sub 推送到 Redis,那么当您在 Mongo 中保存产品时,只需将您的数据也推送到 Redis。使其尽可能简单。
  • 再说一次,我不知道您的数据架构,因此无法提供智能答案。但听起来你想做的只是通知用户有新产品更新。如果 Mongo 是您的主数据库,那么听起来您需要做的就是将更改/新产品的 ID 等推送到 Redis,这就是您真正需要的。然后客户端会收到更新/更改产品的 ID,然后返回到您的 app/mongodb 获取全部数据?
猜你喜欢
  • 2021-01-01
  • 2011-12-08
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 2017-09-11
  • 2022-07-07
  • 2017-09-28
相关资源
最近更新 更多