2014-04-01 50 views
8

使用消息队列进行同步RPC调用我有一个使用jQuery的自动完成插件,它本质上是通过AJAX发送包含文本的请求已被输入到一个文本框到我们的网站服务器的Web应用程序,一旦网络服务器收到这个请求,然后把它交给rabbitmq。是否适合通过AJAX

我知道我们确实从使用消息传递中获得好处,但好像使用它来阻止rpc调用是一种误用,像WCF这样的东西在这种情况下更合适,是这种情况还是被认为是可以接受的建筑?

+0

很显然,这取决于你的应用程序,你可以使用队列中的RPC调用,但我认为这不是它的自然使用。为了帮助你,我有两个问题: 1.你为什么使用同步呼叫? 2.您的当前应用程序有问题吗? 无论如何,我不知道你在开发应用程序的语言,但我认为你可以使用RabbitMQ的异步调用,并使用Spring DeferredResult等技术从队列中获取结果。 我不太喜欢同步调用,因为你无用地阻塞了线程(例如在数据库搜索期间)。 – Gabriele

+0

1.我们有自动完成插件的同步调用,你必须对请求有一个响应2.除了我认为在这种情况下滥用消息,我不想改变它,而且我正在寻找为证据支持这一变化。 – nickbw

回答

3

这是可能的执行与RabbitMQ的RPC同步请求。它的解释非常好,其缺点包括!所以它被认为是可以接受的架构。不鼓励,但只要同步响应是强制性的就可以接受。

,作为一种可能的反效果是,在中间加入RabbitMQ的,你将一些延迟添加到解决方案。

但是你必须在可靠性,灵活性,可扩展性方面获得的可能性,...

+0

是的,这是对我来说这是交易断路器的延迟,你真的不能有一个很慢的自动完成 – nickbw

+0

呃......这里的延迟是用毫毫计算的。速度越快越好,但这不是唯一需要考虑的参数。唯一让我想到的是自动完成应该实现异步。有趣的是,我遇到了[this so post](http://stackoverflow.com/questions/4439953) - 也许它很有用:现在我从来没有使用过自动完成功能,我把它留给了你。 – Sigismondo

0

你会从中得到什么好处?公平地说,如果你把消息放入队列中,它是如何同步的?除非将消息放入队列中的相同过程是将其删除的过程,但这几乎没有用处?

现在,如果你想要做的就是把消息在队列中,稍后处理它是伟大的。 此外,事实上,你有WCF的混合物是恕我直言的某种症状,可能不够清楚。您可以使用WCF作为API网关并使用它将消息写入队列,因此这不是关于WCF或队列,而更像是同步vs异步。

你把你的想法的方式,看起来不正常的我。

+0

有时你必须得到一条消息的回复,对于自动完成,如果你没有得到回应,这将是无用的。我宁愿删除来自消息传递的同步呼叫,并且正在寻找证据来支持/抵触此 – nickbw

+1

在asycn呼叫中,您会收到回复,但不是您的想法。举个例子,如果你在REST中使用CQRS,当你提交一个指令如:AddUserCommand时,你只能得到HTTP代码,比如200,401,406 ......没有别的,即使消息被处理同步。您需要使用另一个API层来检索命令状态。相同的图层(读取模型)是相同的证明您的下拉列表的数据。有一件事是肯定的,如果你想要同步处理,从你的架构中删除队列。 – Marco