【问题标题】:How to implement competing consumer using http如何使用http实现竞争消费者
【发布时间】:2013-08-13 20:18:56
【问题描述】:

我真的很喜欢 James Lewis 的 "Microservices: Java, The Unix Way" 演示。

在本演讲中,James 谈到了通过编写一个队列处理引擎来实现用户注册服务,该引擎从 atom 提要中读取事件并公开一个端点,多个消费者可以从中读取以处理并转换为用户实体。

关于特定slide(视频中大约18:40)的注释说这是使用competing consumer EIP实现的:

“队列处理引擎使用条件 GET、PUT 和 Etags 对事件队列暴露的原子集合实现了竞争消费者模式”

这种队列(以及他们谈论拥有异构消费者的方式)表明它是一个发布-订阅通道。

我真的不明白这是如何实现的,EIP 书中说竞争的消费者才有效:

[...] 点对点通道;发布-订阅频道上的多个消费者只需为每条消息创建更多副本

我假设队列处理器公开了一个 REST 资源,竞争的消费者调用该资源对新项目发出 GET 请求,但是 PUT 请求和 etags 是从哪里进入的呢?

【问题讨论】:

    标签: rest http architecture atom-feed event-driven


    【解决方案1】:

    RFC 5023, The Atom Publishing Protocol, Section 9.5 中解释了在此上下文中使用带有 PUT 方法的实体标签:

    客户端编辑后可以PUT Entry,并在If-Match头中发送ETag实体值,通知服务器在发送的实体值仍然与服务器匹配的条件下接受该条目。

       PUT /edit/first-post.atom HTTP/1.1
       Host: example.org
       Authorization: Basic ZGFmZnk6c2VjZXJldA==
       Content-Type: application/atom+xml;type=entry
       Content-Length: nnn
       If-Match: "e180ee84f0671b1"
    
       <?xml version="1.0" ?>
       <entry xmlns="http://www.w3.org/2005/Atom">
         <title>Atom-Powered Robots Run Amok</title>
         <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
         <updated>2007-02-24T16:34:06Z</updated>
         <author><name>Captain Lansing</name></author>
         <content>Update: it's a hoax!</content>
       </entry>
    

    然而,此后服务器收到了比客户端更新的副本,并以状态代码 412(“Precondition Failed”)响应。

       HTTP/1.1 412 Precondition Failed
       Date: Sat, 24 Feb 2007 16:34:11 GMT
    

    换句话说,如果其他人已经这样做了,客户端不想编辑资源,因此它会在 PUT 请求中发送If-Match 标头中的实体标签。客户端对服务器说,“只有在没有其他人编辑过这个资源的情况下才接受我的编辑。”

    【讨论】:

    • 所以我猜消费者可以针对一个条目发出 PUT 请求以修改它以表示“声明”它,如果另一个消费者已经“声明”它,那么它将产生一个不同的 etag 会中止允许消费者寻找另一个事件来吞噬的请求。
    • AtomPub 的优点之一是拥有多个消费者角色。让这种方法适用于多个消费者角色似乎是可行的,但似乎也应该由消费者来管理他们自己的消费。
    【解决方案2】:

    一位同事与 Martin Fowler 和 James Lewis 进行了交谈,总结了一个只记得一半的总结,他们暗示您只是没有多个队列消费者。

    只需拥有一项正在使用的服务并进行监控,以确保在它出现故障时向您发出警报。

    【讨论】:

    • 我也从多位高级架构师那里得到了这个建议。如果确实需要横向扩展,该单个消费者可以简单地将事件通过管道传输到竞争的消费者队列中。
    猜你喜欢
    • 1970-01-01
    • 2019-07-16
    • 2010-12-05
    • 2011-05-22
    • 1970-01-01
    • 2012-02-22
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多