代码之家  ›  专栏  ›  技术社区  ›  friol

消息传递系统中针对表的队列[已关闭]

  •  16
  • friol  · 技术社区  · 17 年前

    我一直在体验信息系统的好的一面和坏的一面 实际生产环境 ,我必须承认,一个组织良好的表或表的模式在每次使用任何其他形式的消息队列时都会失败,因为:

    1. 数据永久存储在表中。我见过很多java(jms)应用程序在运行过程中由于未捕获的异常或其他错误而丢失或消失消息。
    2. 当您必须使用esotic工具从队列中读取数据时,表很容易访问。

    5 回复  |  直到 10 年前
        1
  •  35
  •   James Strachan    15 年前

    短语 每次都打 这完全取决于你的要求。当然,对每个人来说,它不会每次都赢。

    对于简单、低吞吐量、主要是单线程的东西,数据库是消息队列的一个完全好的替代品。

    消息队列显示的位置是何时

    • 您需要一个高性能、高并发性和可扩展性的负载平衡器,以便能够跨多个服务器/进程每秒并发处理数万条消息(使用数据库表,您很幸运每秒可以处理几百个线程,而使用多个线程进行处理非常困难,因为一个进程往往会锁定消息队列表)

    对于具有单个数据库的简单系统、团队和相当适度的性能要求-请务必使用数据库。使用正确的工具进行作业等。

    然而,消息队列在大型组织中大放异彩,在这些组织中,有许多系统需要相互通信(因此,您不希望业务数据库成为故障的中心点或版本地狱的场所),或者当您有高性能需求时。

    good message queues will perform eager loading of messages to queues to avoid the network overhead of a database .

    类似地,您永远不会使用数据库跨web服务器对HTTP请求进行负载平衡,因为这样做太慢了。如果您对负载平衡器有高性能要求,您也不会使用数据库。

        2
  •  9
  •   dkretz    17 年前

    我首先使用了表,然后在有理由的时候(如果有理由的话)重构成一个完整的消息队列——如果你的设计合理的话,这是微不足道的。

    对您和其他人来说,它不是学习、安装、配置、管理和支持的另一种产品。

        3
  •  9
  •   S.Lott    17 年前
    1. 哪个JMS实现?Sun销售可靠的队列,不会丢失消息。也许您刚刚购买了一款符合JMS标准的低俗产品。IBM的MQ非常可靠,并且有JMS库可以访问它。

    2. 嗯。。。如果您的队列已满,听起来好像有什么东西坏了。如果你的应用程序崩溃,这不是一件好事,而排队与此无关。如果您购买了一个非常糟糕的JMS实现,我可以看出您可能对它不满意的地方。这是一个竞争激烈的市场。找到更好的队列管理器。Sun的JCAPS有一个非常好的队列管理器,以前是SeeBeyond消息队列。

    3. 当您必须使用esotic工具从队列中读取数据时,表很容易访问。

      那不符合我的经验。表是通过这种特殊的“其他语言”(SQL)访问的,并且要求我知道从表到对象的结构映射以及从VARCHAR2到字符串的数据类型映射。此外,我必须使用某种访问层(JDBC或使用JDBC的ORM)。这似乎非常非常复杂。使用简单的发送和接收通过MessageConsumers和MessageProducer访问队列。

        4
  •  7
  •   Robert Rossney    17 年前

    • 将消息丢失到未捕获的异常?这绝不是消息队列的错。您正在使用的应用程序设计得很差。在处理完成之前,他们正在从队列中删除消息。他们没有使用事务或日记。
    • 从队列中读取的深奥仪器?也许如果你发现异步方法很深奥。也许如果你发现序列化和反序列化是深奥的。(至少,这些是我在学习信息时发现的深奥的东西。就像许多看似深奥的技术一样,一旦你理解了它们,它们实际上是非常平凡的,而理解它们是经验丰富的开发人员教育的一个重要部分。)

    使其优于数据库的消息传递方面:

    • 消息队列在新消息到达时通知等待进程。要在数据库中完成此功能,等待进程必须轮询数据库。
    • 关注点分离。 通信通道与消息内容的实现细节分离。只有发送方和接收方需要知道给定消息中数据流的格式。
    • 容错性。 . 当服务器之间的连接断断续续时,可以使用消息传递功能。消息队列可以在本地存储消息,并且只能在连接处于活动状态时将其转发到远程服务器。

    如果你不需要这些东西,你可能不需要信息。

    下面是一个简单的消息传递应用程序示例:我正在构建一个系统,分布在多个网络中的用户正在输入用于生成打印输出的相当复杂的事务集。输出生成在计算上非常昂贵,并且不是其工作流程的一部分;i、 用户不在乎输出何时生成,只在乎输出何时生成。

    因此,我们将事务序列化为消息并将其放入队列中。服务器上运行的进程从队列中获取消息,生成输出,并将输出存储在成像系统中。

        5
  •  2
  •   Maxam    17 年前

    队列提供可靠的消息传递。排队的存储转发和断开连接特性使它比数据库更具可伸缩性,更不用说更健壮。