【问题标题】:Is it appropriate to use message queues for synchronous rpc calls via ajax通过ajax使用消息队列进行同步rpc调用是否合适
【发布时间】:2014-05-12 22:33:29
【问题描述】:

我有一个使用 jquery 自动完成插件的 web 应用程序,它本质上是通过 ajax 向我们的 web 服务器发送一个包含已输入文本框中的文本的请求,一旦 web 服务器收到此请求,它就会被移交给兔子MQ。

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

【问题讨论】:

  • 显然这取决于您的应用程序,您可以使用队列进行 RPC 调用,但我认为这不是它的自然用途。为了帮助你,我有两个问题:1.你为什么使用同步调用? 2.您目前的申请有问题吗?无论如何,我不知道您正在使用哪种语言开发应用程序,但我认为您可以使用 RabbitMQ 的异步调用并使用 Spring DeferredResult 等技术从队列中获取结果。我不太喜欢同步调用,因为你阻塞了线程(例如在你的数据库搜索期间)。
  • 1.我们对自动完成插件有同步调用,您必须对请求 2 做出响应。除了我认为在这种情况下这是滥用消息传递之外没有问题,我想更改它,我正在寻找证据支持这个改变。

标签: rabbitmq soa rpc


【解决方案1】:

你会从中得到什么好处?公平地说,如果您将消息放入队列中,那么同步如何?除非将消息放入队列的进程是​​删除它的进程,但这几乎没用,不是吗?

现在,如果您只想将消息放入队列并稍后处理它,那就太好了。 此外,您对混合物有 WCF 的事实是恕我直言,这表明某些事情可能还不够清楚。您可以将 WCF 用作 API 网关并使用它将消息写入队列,因此这实际上与 WCF 或队列无关,而更像是同步与异步。

你提出想法的方式在我看来不太好。

【讨论】:

  • 有时您必须从消息中获得响应,以便自动完成,如果您没有得到响应,那将是无用的。我更愿意从消息传递中删除同步调用,并正在寻找支持/反驳这一点的证据
  • 在 asycn 调用中,您会得到响应,但不是您想的那样。例如,如果您将 CQRS 与 REST 结合使用,当您提交诸如 AddUserCommand 之类的指令时,您只会得到诸如 200、401、406 之类的 HTTP 代码。即使消息被同步处理,您也不会得到其他任何信息。您需要使用另一个 API 层来检索命令状态。相同的层(读取模型)与为您的下拉菜单证明数据相同。有一件事是肯定的,如果您想要同步处理,请从您的架构中删除队列。
【解决方案2】:

可以使用 RabbitMQ 执行 RPC 同步请求。 Here 解释得很好,包括它的缺点!所以它被认为是一种可接受的架构。不鼓励,但只要同步响应是强制性的,就可以接受。

可能的反作用是在中间添加 RabbitMQ,您会为解决方案增加一些延迟。

但是,您有可能获得可靠性、灵活性、可扩展性……

【讨论】:

  • 是的,对我来说,延迟是交易破坏者,你不能真正拥有缓慢的自动完成
  • 好吧……这里的延迟是用毫秒来衡量的。越快越好,但这不是唯一需要考虑的参数。唯一让我想到的是,自动完成应该异步实现。有趣的是,我遇到了this so post - 也许它可能有用:我现在从未使用过自动完成功能,我把它留给你。
猜你喜欢
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 2014-08-12
  • 2012-01-02
  • 2020-08-31
相关资源
最近更新 更多