3

我真的很喜欢 James Lewis 的“微服务:Java,Unix 方式”演讲。

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

特定幻灯片上的注释(视频中大约 18:40)说这是使用竞争的消费者 EIP实现的:

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

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

我真的不明白这是如何实现的,EIP 书说竞争消费者只能工作:

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

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

4

2 回答 2

2

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

只需拥有一项消费服务并进行监控,以确保在它出现故障时收到警报。

于 2014-06-01T19:11:09.950 回答
2

RFC 5023, The Atom Publishing Protocol, Section 9.5中解释了在这种情况下使用 PUT 方法使用实体标签:

编辑完成后,客户端可以 PUT 条目并在 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(“前提条件失败”)进行响应。

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

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

于 2013-08-23T00:05:11.373 回答