使用 Redis 实现 JMS/AMQP 消息传递模式

2022-09-02 13:35:50

当我遇到一些关于使用消息传递软件(例如ZeroMQRedis)时,这个问题就出现了,但我一直听说Redis本身使用了消息传递系统。那么,如果Redis与其他消息传递系统一起使用,这是否意味着Redis在用作消息传递系统时存在一些严重的缺陷?

虽然使用Redis进行缓存和发布/订阅对我来说很清楚,但目前还不清楚Redis是否可以用于代替成熟的消息传递系统,如JMS,AMQP或ZeromQ。
撇开标准合规性方面不谈,只关注功能/特性,Redis 是否为消息传递系统所需的所有消息传递模式/模型提供支持?

我正在谈论的消息传递模式是:

  1. RPC/Request-reply(一个使用ActiveMQ/JMS的例子另一个使用RabbitMQ/AMQP的例子)
  2. 管道/工作队列(每条消息使用一次,最多一次)
  3. 广播(每个人都订阅了该频道)
  4. 多播(根据消费者的选择器过滤服务器上的消息)
  5. 任何其他消息传递模式?

如果是,那么Redis似乎同时解决了两个(可能更多)方面:缓存和消息传递。

我正在由Java / Java EE服务器支持的Web应用程序的上下文中查看此内容。我不是从概念验证的角度来看待这个问题,而是从大规模的软件开发角度来看待这个问题。

编辑1:
用户:791406问了一个有效的问题:

“谁在乎redis是否支持这些模式;Redis 是否满足您的 SLA 和 QoS 需求?

我认为最好将此细节作为问题的一部分,而不是在评论部分提供。

我目前的需求与SLA和QOS的关系不大,而与为我的工作(消息传递)选择一种工具有关,即使将来我的需求增长(合理地),我也可以使用该工具。我一开始是从简单的需求开始的,我们都知道需求往往会增长。,我不是在寻找一个可以完成所有工作的工具。我只是想知道Redis是否满足了消息传递系统通常的要求,就像ActiveMQ / RabbitMQ一样。当然,如果我的SLA / QOS需求是极端/古怪的,我需要一个特殊的工具来满足这一点。例如:在某些情况下,由于特定的SLA要求,可以比RabbitMQ选择ZeroMQ。我不是在谈论这种特殊要求。我专注于一般的企业需求。

我担心(基于我的小理解)尽管redis可以用作我今天消息传递需求的基本工具,但它可能是将来真正的消息传递工作的错误工具。我有像ActiveMQ / RabbitMQ这样的消息传递系统的经验,并且知道它们可以用于简单到(合理)复杂的消息传递需求。

编辑2

  1. Redis网站提到“Redis经常被用作消息传递服务器”,但如何实现消息传递模式尚不清楚。

  2. Salvatore sanfilippo提到Redis用户倾向于将其用作数据库,消息传递总线或缓存。它能在多大程度上充当“消息传递总线”尚不清楚。

  3. 当我试图找出redis不支持的JMS的哪些消息传递要求时,我遇到了Redis支持但JMS不支持的东西:模式匹配订阅,即客户端可以订阅glob样式的模式,以便接收发送到与给定模式匹配的通道名称的所有消息。

结语

我决定使用JMS来满足我的消息传递需求,并使用Redis进行缓存。


答案 1

您需要什么?

我认为您应该问自己的问题是,在决定使用消息传递平台之前,我需要什么质量的消息传递来支持我的应用程序?谁在乎redis是否支持这些模式;redis 是否满足您的 SLA 和 QoS 需求?首先关注这一点,然后根据该评估做出技术决策。

话虽如此,我将就如何做出这个决定提供我的意见......

高度可靠/持久/持久的消息传递
让我们举一个极端的例子:假设您正在构建一个交易或金融应用程序。此类应用程序需要严格的 SLA,其中消息持久性、可靠性、精确一次交付和持久性至关重要。在这种情况下,使用redis作为消息传递骨干可能是一个糟糕的选择,原因有很多......

  • 消息重新传递(当 sh*t 击中风扇时)
  • 当 redis 出现故障时的消息存储复制
  • 消息事务(redis 不能执行 XA)
  • 生产者/订户容错和断开连接弹性
  • 消息顺序排序
  • 在代理关闭时发送消息(存储和转发)
  • 单线程 redis 可能成为瓶颈

如果您的系统具有严格的SLA,那么肯定会出现部分或全部这些问题,那么您将如何处理这些限制?您可以围绕 redis 实现自定义代码来解决一些问题,但是当像 ActiveMq、WebsphereMQ 和 WebLogic JMS 这样的成熟消息传递平台提供持久性、可靠性和容错能力时,为什么要打扰呢?你说你使用的是Java/Java EE堆栈,所以你可以使用一些最强大的消息传递框架,无论是开源的还是商业的。如果您正在进行金融交易,那么您需要考虑这些选项。

高性能/大型分布式系统消息传递
如果您正在构建一个社交网络或游戏平台,您希望性能胜过可靠性,ZeroMq可能是一个不错的选择。它是一个包裹在类似消息传递的API中的套接字通信库。它是分散的(没有经纪人),非常快,并且具有高度的弹性和容错能力。如果您需要使用代理中介执行 N 到 N pub/sub、流控制、消息持久性或点对点同步等操作,ZeroMq 提供了必要的设施和代码示例,以便使用最少的代码完成所有操作,同时避免从头开始构建解决方案。它是用C语言编写的,但具有几乎每种流行语言的客户端库。

希望有所帮助...


答案 2

推荐