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

这个问题是因为我碰到一些提到(如本),有关使用邮件软件如ZeroMQ 非常久远的Redis,但我不断听到的Redis本身使用的通讯系统。 那么,如果Redis与其他消息传递系统一起使用,这是否意味着Redis本身用作消息传递系统时有一些严重的缺陷?

尽管使用Redis进行缓存和发布/订阅对我来说很明显,但Redis是否可用于取代 JMS,AMQP或ZeroMQ等功能齐全的邮件系统尚不清楚。
单独遵守标准合规性方面,只关注功能/特性,Redis是否支持消息系统所需的所有消息模式/模型?

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

  • RPC /请求 - 回复(使用ActiveMQ / JMS和使用RabbitMQ / AMQP的另一个示例)
  • 管道/工作队列(消耗每条消息一次和最多一次)
  • 广播(每个人都订阅该频道)
  • 多播(基于消费者选择器过滤服务器上的消息)
  • 任何其他消息模式?
  • 如果是,那么Redis似乎一次解决两个(可能更多)方面:缓存和消息。

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

    EDIT1:
    用户:791406问了一个有效的问题:

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

    我认为最好把这个细节作为问题的一部分,而不是在评论部分。

    我目前的需求与SLA和QOS不太相关,更多的是与我的工作(消息传递)选择工具有关,即使我的需求在未来(合理)增长时也可以使用。 我首先从简单的需求开始,我们都知道需求往往会增长。 ,我不是在寻找一种可以完成所有工作的工具。 我只是想知道Redis是否能够满足消息传递系统的一般要求,比如ActiveMQ / RabbitMQ。 当然,如果我的SLA / QOS需求是极端/偏心的,我需要一个专门的工具来满足这个需求。 例如:在某些情况下,由于特定的SLA要求,ZeroMQ可以选择RabbitMQ。 我不是在谈论这样的特殊要求。 我关注的是平均企业需求。

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

    编辑2

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

  • Salvatore sanfilippo提到Redis用户倾向于将其用作数据库, 消息总线或缓存。 它在多大程度上可以作为“消息总线”尚不清楚。

  • 当我试图找出Redis不支持的JMS的消息传递需求时,我发现了Redis支持但JMS不支持的东西: 模式匹配订阅,即客户端可以订阅全局样式模式以接收所有发送给通道名称匹配给定模式。

  • 结论

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


    你需要什么?

    我认为你应该问自己的问题是“我需要什么质量的消息来支持我的应用程序?” 在决定一个消息传递平台之前。 谁在乎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语言编写,但几乎为所有流行语言提供了客户端库。

    希望这有助于...

    链接地址: http://www.djcxy.com/p/5833.html

    上一篇: Achieving JMS/AMQP messaging patterns using Redis

    下一篇: Message passing from rabbitmq channel to java NIO channel