我非常喜欢James Lewis的"Microservices: Java, The Unix Way"演讲。
在本演示中,James讨论了如何通过编写一个队列处理引擎来实现用户注册服务,该引擎从原子源读取事件并公开多个消费者可以读取的端点以处理并转变为用户实体。
特定slide的注释(视频中大约18:40)表示这是使用competing consumer EIP实现的:
“队列处理引擎使用条件GET,PUT和Etags对事件队列公开的原子集合实现了竞争消费者模式”
这种队列(以及他们谈论拥有异构消费者的方式)表明它是一个发布 - 订阅频道。
我真的不明白这是如何实现的,EIP书说竞争的消费者只能运作:
[...]点对点频道;发布 - 订阅频道上的多个消费者只需创建每个消息的更多副本
我假设队列处理器公开了一个REST资源,竞争消费者调用该资源对新项目进行GET请求,但是PUT请求和etags在哪里进入呢?
答案 0 :(得分:2)
在 RFC 5023, The Atom Publishing Protocol, Section 9.5 中解释了在此上下文中使用带有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
换句话说,如果其他人已经这样做,客户端不想编辑资源,因此它会在If-Match
标头中发送带有PUT请求的实体标签。客户端对服务器说:“如果没有其他人已经编辑过此资源,则只接受我的编辑。”
答案 1 :(得分:2)
一位同事采访了马丁福勒和詹姆斯刘易斯,并总结了一半记得的摘要,他们暗示你不会有多个消费者排队。
只需拥有一项消费服务并进行监控,以确保在发生故障时向您发出警报。