当前位置: 首页 > 面试题库 >

Redis发布/订阅具有可靠性

公冶龙野
2023-03-14
问题内容

我一直在寻找使用Redis Pub / Sub替代RabbitMQ。

据我了解,Redis的pub / sub拥有与每个订阅者的持久连接,如果该连接终止,则所有将来的消息都将丢失并掉在地板上。

一种可能的解决方案是使用列表(和阻止等待)将所有消息和pub / sub存储为通知机制。我认为这可以帮助我解决大部分问题,但是我仍然对失败案例感到担忧。

  1. 当订户死亡并重新联机时会发生什么情况,应如何处理所有未决消息?
  2. 当格式错误的消息通过系统时,如何处理这些异常?死信队列?
  3. 是否有实施重试政策的标准做法?

问题答案:

当订户(消费者)死亡时,您的列表将继续增长,直到客户返回。生产商可以在达到特定限制后(从任一侧)修剪列表,但这是您需要在应用程序级别处理的。如果在每个消息中都包含时间戳记,那么您的使用者就可以根据消息的使用期限进行操作,假设您具有要在消息使用期限上执行的应用程序逻辑

我不确定格式错误的消息将如何进入系统,因为与Redis的连接通常是具有完整性保证的TCP。但是,如果发生这种情况,可能是由于生产者层消息编码中的错误所致,您可以通过保留接收消费者异常消息的每个生产者队列来提供一种处理错误的通用机制。

重试策略将在很大程度上取决于您的应用程序需求。如果您需要100%确保已收到并处理了一条消息,则应考虑使用Redis事务(MULTI /
EXEC)来包装使用方完成的工作,因此可以确保客户端不会删除一条消息,除非它已经完成了工作。如果需要显式确认,则可以在专用于生产者进程的队列上使用显式ACK消息。

在不了解您的应用程序需求的情况下,很难知道如何明智地选择。通常,如果您的邮件需要完全的ACID保护,那么您可能还需要使用Redis事务。如果您的消息仅在及时的情况下才有意义,则可能不需要进行交易。听起来好像您不能容忍丢弃的消息,所以使用列表的方法很好。如果需要为邮件实现优先级队列,则可以使用排序集(Z命令)将邮件(以其优先级作为得分值)和轮询使用者一起存储。



 类似资料:
  • 主要内容:发布/订阅流程,常用命令汇总,基本命令应用Redis PubSub 模块又称发布订阅者模式,是一种消息传递系统,实现了消息多播功能。发布者(即发送方)发送消息,订阅者(即接收方)接收消息,而用来传递消息的链路则被称为  channel。在 Redis 中,一个客户端可以订阅任意数量的 channel(可译为频道)。 消息多播:生产者生产一次消息,中间件负责将消息复制到多个消息队列中,每个消息队列由相应的消费组进行消费,这是分布式系统常用的

  • 我有一个问题非常困扰我。Redis发布/订阅功能的实际用途是什么?我只能想到通过TCP(本地或分布式)进行进程间通信,但其他的就不多了。 有人能证明我错了吗。

  • 问题内容: 为什么数据存储Redis具有发布/订阅功能?我首先想到的是实现这样的事情是错误的层。但也许我需要跳出框框思考。 问题答案: Redis被定义为数据结构服务器。Redis提供了多种功能,例如内存缓存,队列,发布订阅等。这对于cloudapp / webstack非常有用,其中3个组件RabbitMQ(排队)+ XMPP(发布订阅)+内存缓存目前可以用redis代替。排队功能不如Rabbi

  • 目前,我正在开发一个分布式测试执行和报告系统。我计划将Redis PUB/SUB用作消息队列和消息分发系统。 我是Redis的新手,所以我试着阅读尽可能多的文档,并尝试着使用它。最重要的主题之一是高可用性。正如我所说,我不是专家,但我知道可能的选择——使用Sentinel、复制、集群等。 我不清楚的是Pub/Sub功能和HA选项是如何相互关联的。使用Redis构建可靠消息传递系统的最佳实践是什么?

  • Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道。 下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2、client5 和 client1 之间的关系: 当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个

  • 问题内容: 跟随Redis Pub / Sub 这工作正常,我可以使用以下任何语言发布消息 使用,我可以验证此请求是否已正确发布 当我将订阅者 块 添加到 其他类(侦听器类)中的 该频道时,问题就开始了,如下所示 中的,还表明侦听器已正确订阅 问题是,当我将订户侦听器类添加到相同的Rails应用程序时…它停止工作,导致侦听Redis服务器并停止执行任何其他代码…它只是坐在那里侦听。 因此,有一种方