Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么使用RabbitMQ等排队系统_Rabbitmq_Queueing - Fatal编程技术网

为什么使用RabbitMQ等排队系统

为什么使用RabbitMQ等排队系统,rabbitmq,queueing,Rabbitmq,Queueing,我不是高级程序员,但我已经部署应用程序一段时间了,并且开发了小型完整系统 我开始听说诸如RabbitMQ之类的排队系统。也许,我从未开发过任何必须使用排队系统的系统。但是,我担心如果我不使用它,因为我不知道该怎么做。我已经在他们的网站上阅读了RabbitMQ教程,但我不知道为什么我会使用它。我不确定,如果没有额外的组件和常规数据库或类似工具,传统编程是否无法实现这些目标 有人能用一个小例子解释一下我为什么要使用排队系统吗。我的意思不是一个hello world的例子,而是一个实际的场景 非常感谢

我不是高级程序员,但我已经部署应用程序一段时间了,并且开发了小型完整系统

我开始听说诸如RabbitMQ之类的排队系统。也许,我从未开发过任何必须使用排队系统的系统。但是,我担心如果我不使用它,因为我不知道该怎么做。我已经在他们的网站上阅读了RabbitMQ教程,但我不知道为什么我会使用它。我不确定,如果没有额外的组件和常规数据库或类似工具,传统编程是否无法实现这些目标

有人能用一个小例子解释一下我为什么要使用排队系统吗。我的意思不是一个hello world的例子,而是一个实际的场景

非常感谢你抽出时间

RM
消息队列等中间件的关键用途之一是能够在非同质系统之间发送数据。信息本身可以是很多东西。字符串是不同系统上的不同语言最容易理解的,但在传输更有意义的数据时通常不太有用。因此,JSON和XML在消息中非常流行。这些只是结构化字符串,可以在使用者端转换为所选语言的对象

其他有用功能:

在某些MQ系统(如RabbitMQ)中,并非在所有MQ系统中都是这样的:客户机非常好地处理事情的通信端。 这些消息可以是异步的。如果消费者下线,则信息将一直保留,直到消费者恢复在线。 MQ系统可以设置为不同程度的消息持久性。它们可以在读取后从队列中删除,也可以保留,直到确认。它们可以是持久的,因此即使MQ系统停机,消息也不会丢失。
下面是一些可能是人为的例子。本地系统上的Java程序希望通过internet将消息发送到连接的网络上的系统。本地系统有一台连接到internet的服务器。来自internet的所有内容都被阻止,但与MQ的连接除外。Java程序可以将消息发布到MQ,而无需访问internet。消息一直位于队列上,直到外部系统接收它。Java程序发布一条消息,比如说XML,使用者可以是一个Perl程序。只要他们能够通过预定义的序列化和反序列化方式理解XML,就可以了

消息队列等中间件的关键用途之一是能够在非同质系统之间发送数据。信息本身可以是很多东西。字符串是不同系统上的不同语言最容易理解的,但在传输更有意义的数据时通常不太有用。因此,JSON和XML在消息中非常流行。这些只是结构化字符串,可以在使用者端转换为所选语言的对象

其他有用功能:

在某些MQ系统(如RabbitMQ)中,并非在所有MQ系统中都是这样的:客户机非常好地处理事情的通信端。 这些消息可以是异步的。如果消费者下线,则信息将一直保留,直到消费者恢复在线。 MQ系统可以设置为不同程度的消息持久性。它们可以在读取后从队列中删除,也可以保留,直到确认。它们可以是持久的,因此即使MQ系统停机,消息也不会丢失。
下面是一些可能是人为的例子。本地系统上的Java程序希望通过internet将消息发送到连接的网络上的系统。本地系统有一台连接到internet的服务器。来自internet的所有内容都被阻止,但与MQ的连接除外。Java程序可以将消息发布到MQ,而无需访问internet。消息一直位于队列上,直到外部系统接收它。Java程序发布一条消息,比如说XML,使用者可以是一个Perl程序。只要他们能够通过预定义的序列化和反序列化方式理解XML,就可以了

MQ系统往往在火灾和遗忘场景中工作得最好。如果发生了一个事件,需要通知其他人,但源系统不需要来自其他系统的反馈,那么MQ可能是一个很好的选择

如果您了解MQ的优点和缺点,但仍然不理解为什么它适合特定的系统,那么它可能不是。我见过使用MQ但不需要MQ的系统,结果并不理想

我见过的大多数情况下,它都是在不相关的系统之间进行集成的,通常是开箱即用的系统。假设您有一个接受订单的系统,另一个系统负责填写订单并发货。在这种情况下,订单系统可以使用
MQ通知履行系统订单,但订单系统没有兴趣等待履行系统收到订单。因此,它会将消息放入队列中,并继续运行。

MQ系统往往在火灾和遗忘场景中工作得最好。如果发生了一个事件,需要通知其他人,但源系统不需要来自其他系统的反馈,那么MQ可能是一个很好的选择

如果您了解MQ的优点和缺点,但仍然不理解为什么它适合特定的系统,那么它可能不是。我见过使用MQ但不需要MQ的系统,结果并不理想


我见过的大多数情况下,它都是在不相关的系统之间进行集成的,通常是开箱即用的系统。假设您有一个接受订单的系统,另一个系统负责填写订单并发货。在该场景中,订单系统可以使用MQ通知订单的履行系统,但订单系统不希望等待履行系统收到订单。这是一个非常简单的答案,但它给出了一般的想法

让我们从电话和电子邮件的角度来考虑这个问题。假装电子邮件不存在。要完成工作,你必须给每个人打电话。当你通过电话与某人交流时,你需要让他们坐在办公桌旁才能联系到他们,假设他们在工厂里,听不到他们的手机铃声:-如果你想联系的人不在办公桌旁,你会一直等着他们回电话,或者更可能的是,你会稍后再给他们回电话。你也一样,除非有人打电话给你,否则你没有任何工作要做。如果多人同时打电话,你不知道,因为你一次只能处理一个人

但是,如果我们有电子邮件,您可以将您的请求与其他人一起排队,回答,但更可能在他们方便时忽略。如果他们确实忽略了你的电子邮件,你可以随时重新发送。你不必等到他们在办公桌上,他们也不必等到你挂断电话。工作量平衡了,事情进行得更加顺利。作为额外的奖励,你可以将你不想处理的消息转发给你的员工

在系统工程中,我们使用术语紧密耦合来定义程序或程序的一部分,这些程序或程序的工作方式与上述电话场景类似。它们彼此非常密切地依赖,通常在程序的各个部分之间共享实现。在这些程序中,数据以串行顺序处理,一次一个。这些系统通常易于构建,但有几个重要的缺点需要考虑:1更改程序的任何部分可能会导致整个代码的级联更改,这会引入bug;2系统的可扩展性不是很强,通常必须随着需求的增长而废弃和重建;3系统的所有部分必须同时工作,否则整个系统将无法工作

基本上,如果程序非常简单或者有一些特殊的理由使用紧密耦合的程序,那么紧密耦合的程序是好的

在现实世界中,事情要复杂得多。程序不可能那么简单,以紧密耦合的方式开发企业应用程序将成为一场噩梦。因此,我们使用松散耦合这个术语来定义由许多较小的部分组成的大型系统。这些部件具有非常明确的边界和功能,因此可以更容易地完成系统的更改。这是面向对象设计的本质。像RabbitMQ这样的消息队列允许在各种程序和程序的各个部分之间进行类似电子邮件的通信,从而使工作流更像是与人之间的通信。增加额外的容量就成了一件简单的事情,只要在需要的地方启动和增加计算机

显然,这是一个粗略的简化,但我认为它传达了一般的想法。构建使用消息队列的应用程序使您能够利用云服务提供商部署大规模可扩展的应用程序。以下是一篇关于云设计的文章:

这是一个非常简单的答案,但它给出了总体思路

让我们从电话和电子邮件的角度来考虑这个问题。假装电子邮件不存在。要完成工作,你必须给每个人打电话。当你通过电话与某人交流时,你需要让他们坐在办公桌旁才能联系到他们,假设他们在工厂里,听不到他们的手机铃声:-如果你想联系的人不在办公桌旁,你会一直等着他们回电话,或者更可能的是,你会稍后再给他们回电话。你也一样,除非有人打电话给你,否则你没有任何工作要做。如果多人同时打电话,你不知道,因为你可以 n一次只能处理一个人

但是,如果我们有电子邮件,您可以将您的请求与其他人一起排队,回答,但更可能在他们方便时忽略。如果他们确实忽略了你的电子邮件,你可以随时重新发送。你不必等到他们在办公桌上,他们也不必等到你挂断电话。工作量平衡了,事情进行得更加顺利。作为额外的奖励,你可以将你不想处理的消息转发给你的员工

在系统工程中,我们使用术语紧密耦合来定义程序或程序的一部分,这些程序或程序的工作方式与上述电话场景类似。它们彼此非常密切地依赖,通常在程序的各个部分之间共享实现。在这些程序中,数据以串行顺序处理,一次一个。这些系统通常易于构建,但有几个重要的缺点需要考虑:1更改程序的任何部分可能会导致整个代码的级联更改,这会引入bug;2系统的可扩展性不是很强,通常必须随着需求的增长而废弃和重建;3系统的所有部分必须同时工作,否则整个系统将无法工作

基本上,如果程序非常简单或者有一些特殊的理由使用紧密耦合的程序,那么紧密耦合的程序是好的

在现实世界中,事情要复杂得多。程序不可能那么简单,以紧密耦合的方式开发企业应用程序将成为一场噩梦。因此,我们使用松散耦合这个术语来定义由许多较小的部分组成的大型系统。这些部件具有非常明确的边界和功能,因此可以更容易地完成系统的更改。这是面向对象设计的本质。像RabbitMQ这样的消息队列允许在各种程序和程序的各个部分之间进行类似电子邮件的通信,从而使工作流更像是与人之间的通信。增加额外的容量就成了一件简单的事情,只要在需要的地方启动和增加计算机

显然,这是一个粗略的简化,但我认为它传达了一般的想法。构建使用消息队列的应用程序使您能够利用云服务提供商部署大规模可扩展的应用程序。以下是一篇关于云设计的文章:

您可以查看下面的链接。它有一个广泛的描述:您可以查看下面的链接。它有一个广泛的描述: