Как обеспечить передачу сообщений по выводу / опроса из веб-сервера

StackOverflow https://stackoverflow.com/questions/4030433

Вопрос

Это строит Как отправлять сообщения между компаниями. Отказ Если я решаю, что компания S (uppler) должна опросить заказы от компании (b) в некотором простых https, что является лучшей реализацией.

  • Я предполагаю, что компания B имеет бег веб-сервера, а база данных Backend этого веб-сервера прочтена. Мы должны сделать как можно меньше возможных предположений о процессах хранения в S и, если они способны удерживать состояние (например, список уже переданных руководств)
  • Интернет-соединение между B и S не является удаленным.
  • Мы должны добраться возможная согласованность Значение в одном моменте во времени все заказы между B и S должны быть переданы.

Какова лучшая практика для реализации такой системы?

Это было полезно?

Решение

Одним из подходов к такому виду проблем является использование какого-то продукта в очереди, как IBM, которого я сразу считаю MQ. Однако, поскольку я не на самом деле не тот человек сам, как вы, я, вероятно, был бы счастлив с подходом на основе услуг, который вы принимаете.

Есть два возможных подхода, которые приходят на ум. Один - использовать WS Надежные сообщения, который подталкивает проблему на надежности в инфраструктуру веб-службы. Другой - передавать свой собственный надежный протокол на вершине простых, но ненадежных, услуг.

У меня нет серьезного практического опыта внедрения системы с помощью надежных сообщений WS, я считаю, что его можно сделать для работы, но это требует некоторой степени контроля над участниками - как это сравнительно недавний стандарт, который мы не можем Гарантия того, что любая предоставленная IT-магазин будет осуществлять вручную, а взаимодействие между поставщиками может быть проблемой. Чем больше у меня контроль над стеками SW на каждом конце, тем более наклонено, я бы использовать надежные сообщения WS. [Я должен также упомянуть атомную транзакцию WS, которая также может быть использована для создания реализации услуг, применяются те же взаимозависимые межоперационные проблемы.

Так что насчет самостоятельного? Ключ здесь состоит в том, чтобы сделать все услуги IdEmpotent. Поскольку у нас нет транзакционных гарантий, которые охватывают две системы, мы должны предположить, что любой данный сервисный вызов может потерпеть неудачу с неизвестным результатом.

Я собираюсь предположить, что B хочет, чтобы подтвердить, что S принял заказ, поэтому нам нужно обновить информацию как в B и S, когда заказ передается.

B должны предлагать такие услуги, как эти:

 Give me the next order(s)

 I have stored {orders ...}

Так как мы определяем «следующее». Самое простое дело работает хорошо, если тома, с которыми мы имеем дело, могут позволить нам иметь одну «нить» передачи. Затем B тикает отправленные заказы один за раз, а заказы имеют монотонно растущий идентификатор. Затем мы можем упростить:

 I have stored order <65,004> please give me the next

Обратите внимание, что это idempotent запрос: он может безопасно повторяться много раз. Также обратите внимание, что S должно предвидеть возможность получения того же порядка дважды и проверить для дубликатов.

Другие советы

То, что вы, вероятно, ищете, это два фазы. Он хорошо описан в Интернете, здесь, например:

http://en.wikipedia.org/wiki/two-phase_commit_protocol

Гист этого:

Процесс коммита поступит следующим образом:

* Phase 1
      o Each participating resource manager coordinates local 
        operations and forces all log records out:
      o If successful, respond "OK"
      o If unsuccessful, either allow a time-out or respond "OOPS" 
* Phase 2
      o If all participants respond "OK":
            * Coordinator instructs participating resource managers to "COMMIT"
            * Participants complete operation writing the log record
              for the commit 
      o Otherwise:
            * Coordinator instructs participating resource managers to "ROLLBACK"
            * Participants complete their respective local undos 

Следует работать на любые данные.

Хорошо, прежде всего, вы не можете гарантия что-нибудь над ненадежной ссылкой. То Проблема двух генералов Доказывает это как для детерминированных, так и для недетерминистских протоколов. Все, что вы можете сделать, это смягчить ненадежность до приемлемой степени.

Самый простой метод в вашем случае, как только сервер получает запрос опроса, он отправляет x Количество ответов, все с то же GUID. Отказ Например.

S: B, anything new?
S: B, anything new?
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need a jacket (order #123).
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need some shoes (order #124).
S: B, anything new?
B: Yes, S, I need some shoes (order #124).
...

S Может появиться с помощью заказов, но поскольку # отправляется с каждым запросом, это не имеет большого значения. Если мы пропустили это раньше, мы получаем это сейчас. Если бы мы не получили его раньше, Woohoo! У нас есть это сейчас. Система работает! Вы заметите это B отправляет сообщения 5 раз в моем примере. В реалистичном сценарии вы, вероятно, отправили бы сообщение сотни или тысячи раз, пока у вас не будет желаемой надежности.

Теперь вышеуказанное решение обрабатывается и пропускная способность интенсивно, но она работает. Более умный метод - делать то, что делает TCP: иметь трехстороннее рукопожатие.

S: Hello B. Are you there? -> SYN
B: Hello S, yep I'm here. What's up? -> SYN+ACK
S: Oh good, you're there. -> ACK
S: B, anything new?
B: Yes, S, I need a jacket (order #123).

Но .. http уже делает это. Так что, если что-то не попадет где-нибудь, вы узнаете. Время соединения, соединение сломалось и т. Д.

Теперь вы можете переписать эти сценарии в пределах уровня приложения (введите WS-ReliaBlemessaging), но действительно TCP уже надежен. Некоторые критики этих рамок мыла (Иш) и из искусственных протоколов (они работают сверху http) обвиняют их в по существу, по существу восстановлению колеса - и задачи колеса - на более высоком уровне абстракции.

Суть в том, что любая система может потерпеть неудачу, включая надежные системы обмена сообщениями.

Что касается возможной последовательности, я думаю, вы можете быть запутаны. Возможная согласованность относится только к распределенным системам хранения, где после Write(), вы не сможете не сможете определить его с помощью Read() на некоторое время. Это не похоже на вашу проблему вообще. Я имею в виду, я вижу, что вы говорите, но в eventually consistent Система, надежное (достаточно) соединение предполагается между узлами. Вы не делаете этого предположения (хотя я думаю, что вы должны ... TCP довольно Darn надежный).

Здание на что упомянула Дина. WebServices будет идеальным решением вышеуказанной проблемы. Какой-то протокол может быть согласован, на котором будет определять количество записей.

S ---> D ( Call a service which would list record keys)
D----> S ( provide xml of keys)
S----> D ( Request each of the records)
D----> S ( Submit record)

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

Поскольку связь обрабатывается, купите двигатель веб-сервиса, вам не нужно беспокоиться о параметрах сообщения. SSL может быть добавлен для безопасности.

Ваше здоровье!

Я думаю, что вы пытаетесь сказать, что компания B - пассивный участник. S (поставщик) просто нужна возможность получения всех заказов, которые B поста (возможная согласованность). Но B не нуждается в том, какие заказы уже есть (нет необходимости в фиксации).

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

Я не уверен, что вы имеете ввиду лучшие практики или лучшие компромисс для простого в реализации системы. В зависимости от времени и времени отклика нет необходимости сделать его динамической системой, если вы в любом случае выбираете. Дамп заказы как текстовые файлы (с именем Timestamp) в каталог с именем датой и потяните их все (или выборочно). Вы даже можете хранить их в каталогах к часу или что-то то, что имеет смысл. HTTP GET IDEMPOTENT.

Это может быть уродливым, но звучит так, как вы не ожидаете много сложности от компании B. Используйте SSL и AUTH, и он заблокирован и зашифрован.

Если вам не нужна производительность, нет ничего плохого в простом. Что вы действительно получаете от сложного протокола?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top