Как синхронизировать HTTP-запрос PATCH с нескольких компьютеров на один компьютер - PullRequest
0 голосов
/ 24 октября 2019

У меня один и тот же api верблюда на 2 разных машинах, скажем, A и B, в конце 2 разные машины (A и B) указывают на общий сервер приложений, скажем, C, где выполняется обновление записи, прежде чем выполнять обновлениенесколько методов get для сбора информации с общего сервера приложений (C). (Это для общего идентификатора, скажем, 10 от A и B)

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

Вот что я пробовал:

У машин A и B есть общая база данных, поэтому я попытался сохранить ID в db для запроса A и проверить, существует ли онтот же идентификатор, который он должен ждать в случае B. Как только завершенный идентификатор его обработки будет удален из БД, и B проверит, что в этот момент он не получит идентификатор и запустит свой процесс.

К сожалению, у меня есть решениепопытка не подходит, кажется, было бы здорово, если бы вы могли предложить какое-то решение по этому поводу.

PS: я использую верблюжий маршрут, здесь несколько запросов get выполняются перед выполнением обновления, поэтому я хочусделать 1 запрос в ожидании, это не может быть достигнуто синхронизацией, потому что машины A и B различны.

Нет такого кода, который можно вставить как oе сейчас

Спасибо,

1 Ответ

0 голосов
/ 25 октября 2019

Вы можете «синхронизировать» этот сценарий, отделяя сбор данных от операции обновления с очередями JMS . A и B собирают необходимые данные и, наконец, отправляют запросы на обновление в виде сообщений JMS в одну и ту же очередь.

C (или кто-то еще) использует сообщения и просто выполняет запросы на обновление к C.

Это асинхронное решение подразумевает, что A и B не нуждаются в синхронном ответе для запроса на обновление.

То, что кардинально меняет обработку ошибок . Вы должны обрабатывать ошибки обновления на стороне потребителя. Когда A и B успешно отбрасывают запрос на обновление в очереди, они больше не несут ответственности. Если ошибка возникает позже, она не достигает их. Поэтому вам необходимо проверить данные на A и B и отклонить запрос, если данных недостаточно для обновления.

С другой стороны, вы можете обрабатывать запросы на A и B, когда C выключен. Они не заботятся, пока брокер готов отбрасывать сообщения. Когда C снова работает, он может обрабатывать сообщения в очереди.

Чтобы строго синхронизировать на стороне потребителя, вы просто используете только 1 потребитель .

Если вы используете JMS-брокер, который поддерживает группы сообщений (например, ActiveMQ), вы даже можете настроить этот сценарий. Предположим, вам нужно только синхронизировать запросы с тем же идентификатором . В этом случае вы устанавливаете идентификатор как JMSXGroupID. Тогда вы можете использовать столько потребителей, сколько захотите, и брокер позаботится о том, чтобы все запросы на один и тот же идентификатор обрабатывались одним и тем же потребителем (и, следовательно, синхронизировались).

...