2013-08-12 1 views
3

Мне очень понравилась презентация Джеймса Льюиса "Microservices: Java, The Unix Way".Как реализовать конкурирующий потребитель с помощью http

В этой презентации Джеймс рассказывает о внедрении службы регистрации пользователей, написав механизм обработки очереди, который считывает события с корма атома и предоставляет конечную точку, которую несколько пользователей могут читать, чтобы обрабатывать и превращаться в пользовательские объекты.

Примечание на конкретный slide (около 18:40 в видео) говорит, что это было реализовано с помощью competing consumer EIP:

«реализовано Queue Processing Engine конкурирующей шаблон потребителя с использованием условного GET, PUT и ETags против коллекции атомов, выставленной в очереди событий «

Этот вид очереди (и способ, которым они говорят о гетерогенных потребителях) предполагает, что это канал публикации-подписки.

Я не очень понимаю, как это может быть реализовано, книга EIP говорит, что конкурирующие потребители работает только:

[...] с поточечными каналами; несколько потребителей на публикацию-подписке канал просто создать несколько копий каждого сообщения

Я предполагаю, что процессор очереди выставляет REST ресурс, конкурирующие потребители называют делают запросы GET для новых элементов, но где делать запросы PUT и в него входят епаги?

ответ

2

Коллега говорил с Мартином Фаулером и Джеймсом Льюисом и суммировал наполовину запоминающееся резюме, они подразумевали, что у вас просто нет нескольких потребителей очереди.

Просто имейте один потребительский сервис и следите за тем, чтобы вы были предупреждены, если он опустится.

+0

У меня был этот совет от нескольких старших архитекторов. Этот единственный потребитель может просто передать события в конкурирующую потребительскую очередь, если действительно требуется масштаб. – Seth

2

Использование тегов сущностей с помощью метода PUT в этом контексте объясняется в RFC 5023, The Atom Publishing Protocol, Section 9.5:

После редактирования, клиент может поместить запись и отправить значение ETag сущности в заголовке If-Match , информируя сервер, чтобы принять запись при условии, что отправленное значение сущности все еще соответствует серверу.

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 («Предпосылка Failed»).

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

Другими словами, клиент не хочет, чтобы отредактировать ресурс, если кто-то уже сделано, поэтому он посылает сущности тег в If-Match заголовка с запросом PUT. Клиент говорит серверу: «Только принимайте мое редактирование, если никто еще не редактировал этот ресурс».

+0

Таким образом, я думаю, что потребитель может выдавать запрос PUT на запись, чтобы изменить его, чтобы обозначить «требование», а если другой потребитель уже «заявил» его, тогда он произведет другой этаг, который прервет запрос, позволяющий потребителю искать другое событие, чтобы сожрать. – plasma147

+0

Один из преимуществ AtomPub состоит из нескольких ролей пользователя *. Использование такого подхода для нескольких потребительских ролей кажется уместным, но также кажется, что, вероятно, должно быть, чтобы потребители управляли своим собственным потреблением. – Seth