【问题标题】:Is a REST messaging layer for micro services fast enough?用于微服务的 REST 消息传递层是否足够快?
【发布时间】:2019-08-29 05:48:24
【问题描述】:

我对微服务知之甚少,所以这肯定是我学习阶段的一部分。假设我有多个 nodejs 微服务(身份验证服务、用户服务、车辆服务等)。在这两者之间共享数据的最佳方式是什么?

HTTP 调用是否足够好?因为从“Pointsman”服务或其他东西调用许多 HTTP 调用非常容易。所有这些 nodejs 服务都将在同一台机器上运行,因此它们应该具有相当快的速度。 HTTP 调用也是异步的,因此您可以相当轻松地控制服务如何相互等待。基本的调用测试看起来超级快,但很难知道更大的数据块将如何工作。

我之所以问是因为人们谈论消息传递层。消息将位于服务观看的地方。因此服务将放置和提取为它们分配的消息。

我只是觉得 HTTP 调用已经足够好了,为什么不使用它们呢?

【问题讨论】:

    标签: node.js http microservices


    【解决方案1】:

    要回答您的问题,我们需要了解存在差异。微服务之间需要发生的各种通信,并且基于此存在差异。方法。

    让我们通过 Facebook 的域示例来讨论通信类型:

    1. 用于消息传递您喜欢某个帖子。在这种情况下,需要发生很多事情,首先需要增加帖子的点赞数,然后一些推荐服务会根据你的推荐变化来尝试查看你喜欢什么样的帖子,一些应用服务会发送一些通知到关于帖子更新等的应用程序。在这些基于像 UserLikedAPost 这样的事件的情况下,许多事情需要在 diff 中发生。微服务,我们应该将此类事件写入 Kafka 或 Rabbit MQ 等消息队列中,然后其他服务可以订阅并完成相应的工作。

    在这种情况下,我们不希望在发送用户 HTTP 请求的最终响应之前完成所有其他操作,因为这会使 post like 请求时间增加。

    1. 对于 HTTP 或 gRPC 获取我的帐户详细信息:在这种情况下,在显示您的数据时,会显示您的兴趣,您的工作都是 diff 的一部分。微服务,如兴趣和工作。为此,当一个请求到来时,该请求需要使用 Rest 或 gRPC(使用 JSON 对 REST 进行了高度优化)调用每个服务以返回结果。

    现在我已经为您提供了同时需要消息传递和 HTTP(或 gRPC)的示例。

    此外,您可能更喜欢其中一种情况。您可能想阅读:microservices pattern 以了解有关这些内容的更多信息

    【讨论】:

    • 我不太同意您的消息传递示例。使用 HTTP,您仍然可以返回一个异步响应,即 Thanks for your input. Your data is in process and we will notify you when everything is done。所以你In this case sync will be very bad...这句话跟HTTP没有关系。我的观点是:HTTP 仍然可以是异步的。
    • 我认为我的示例没有正确放置,我说同步的方式是:假设 UI 向服务 1 发出 HTTP 请求,服务 1 需要从服务 2 和服务 3 获取数据以返回确切的数据到 UI ,但是如果说您返回您的数据正在进行中,则您需要将此状态存储在某个消息传递队列或数据库中,否则如果该机器重新启动或出现某些错误,您的消息或请求丢失。因此,如果您想立即返回结果,则一个服务使用 HTTP 调用其他服务并在完成后返回结果。如果其他服务需要做出反应,那么消息队列
    • 我明白了。也许根据您在此处所说的内容更新您的答案(现在这更有意义)。您对消息队列工具有什么建议吗?
    • 你用过RabbitMQ吗?如果是这样,为什么 Kafka 比 RabbitMQ 更好?
    【解决方案2】:

    问题不在于速度是否足够快,而在于可扩展且可用的微服务。

    HTTP 协议已同步

    人们普遍认为 HTTP 是异步的。 Http 是同步协议,但您的客户端可以异步处理它。例如。当您使用 http 调用任何服务时,您的 http 客户端将安排在后端线程(异步)上。但是,http 调用将一直等待,直到超时或响应返回,在所有这段时间内,http 调用链都在同步等待。现在,如果您一次有数百个请求,您可以想象有多少个 http 调用被同步调度,并且您可能会运行套接字。

    AMQP

    在微服务架构中,我们更喜欢 AMQP(高级消息队列协议)。这意味着服务将消息放入队列并忘记它。这是真正的异步传输协议,因为一旦将消息放入队列中,您的服务就完成了,感兴趣的服务会选择这些。

    这种类型的协议是首选,因为即使其他服务出现故障,您也可以毫无顾虑地扩展,因为它们最终会获得消息/事件/数据。

    这就是为什么 HTTP 不是共享消息/数据的首选方式的原因。

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 2019-10-26
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 2018-07-15
      • 2018-11-28
      相关资源
      最近更新 更多