Очереди SQS / Тайм-ауты видимости / группы сообщений - PullRequest
1 голос
/ 20 марта 2019

Я новичок в AWS. Я пытаюсь понять SQS здесь. Я также прошел несколько тренингов, но так и не смог получить ответы на них на форуме. Я повторяю свой вопрос здесь. Обратите внимание, что я знаю, что несколько вопросов ниже имеют очевидные ответы и, следовательно, больше риторики Моя путаница проистекает из того факта, что мое понимание этой темы в настоящее время заставляет меня давать противоречивые ответы на последующие вопросы, которые возникают у меня в голове после очевидных известных, и лишают уверенности все, что, как мне кажется, я понимаю, хорошо.

Если у меня есть Стандартная очередь с именем MyQueue , и есть 100 сообщений, и если есть 2 совершенно отдельных приложения (в качестве потребителей; обратите внимание, что они не являются группой потребителей те же приложения, что и у вас в Kafka; вместо этого они являются двумя отдельными приложениями) для этой очереди, тогда потребители могут получить

(i) сообщения о неисправности и

(ii) несколько копий сообщений

Оба моих приложения не должны беспокоиться о порядке сообщений. Но ради вопроса, скажем, у нас есть идеальный порядок доставки, нет многократных копий и нет проблем с сетью, и оба потребителя заканчивают свою обработку, если каждое сообщение находится в пределах окна Visibility Timeout.

Q1: Будут ли оба приложения по отдельности получать по 100 сообщений каждое или сообщение, предоставленное одному потребителю, никогда не будет доставлено другому потребителю? Если последнее верно (без проблем с сетью, из-за доставки заказа, нескольких доставок), то:

  1. Является ли SNS-SQS разветвленным способом, чтобы гарантировать, что одно и то же сообщение обрабатывается несколькими потребителями?
  2. Должен ли потребитель удалять сообщение из очереди после обработки? Таким образом, если сообщение получено процессором, и оно переходит в тайм-аут видимости во время обработки, а затем не удаляется потребителем даже после завершения обработки до истечения тайм-аута видимости, тогда сообщение появляется обратно для других потребителей, возможно потреблять его Если это так, то будет ли то же самое применяться и к очереди FIFO?

Другие вопросы:

Q2: Применимо ли время ожидания видимости как к стандартной очереди, так и к очереди FIFO? Если это также применимо к очереди FIFO, которая обещает ровно одну доставку, то, если Тайм-аут видимости появляется до того, как потребитель заканчивает обрабатывать сообщение, то он появляется в очереди только для повторной доставки, возвращаясь, по крайней мере, к одной обработке. Кто-нибудь может подтвердить?

Q3: Что такое несколько групп сообщений в очереди FIFO? Они как разделы очереди?

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

В: Будут ли оба приложения по отдельности получать по 100 сообщений каждое?

Потребитель может запросить до 10 сообщений на вызов API.Они станут «невидимыми» и будут не предоставлены другим потребителям.(Ну, на самом деле - это небольшая вероятность того, что сообщение может быть предоставлено нескольким потребителям. Это редко, но может случиться. Если это плохо для вашего варианта использования, то вы должны отслеживать сообщенияв базе данных, чтобы гарантировать, что они обрабатываются только один раз каждый.)

В: Разветвление SNS-SQS - это способ гарантировать, что одно и то же сообщение обрабатывается несколькими потребителями?

Очень странно хотеть, чтобы единственное сообщение потреблялось «несколькими потребителями».Обычное желание - обрабатывать каждое сообщение один раз.Если вы хотите, чтобы сообщение обрабатывалось несколькими потребителями, то да, вы можете отправить сообщение в SNS, который затем может отправить его в несколько очередей.

В: Предполагается, что потребитель должен удалить сообщение?из очереди после обработки?

Да.Amazon SQS не знает, когда обрабатывается сообщение.Потребитель должен удалить сообщение с помощью ReceiptHandle, предоставленного при получении сообщения.Если тайм-аут сообщения и другой потребитель получает его, SQS предоставит другой ReceiptHandle, чтобы он знал, какой процесс запросил удаление.

Это также относится к очередям FIFO.

В: Действует ли тайм-аут видимости как для стандартной очереди, так и для очереди FIFO?

Да.Если время ожидания видимости истекло, сообщение будет передано другому потребителю.«Точно одна доставка» позволяет избежать редкой ситуации, упомянутой выше, когда сообщение в стандартной очереди может быть предоставлено более одного раза.Однако, если время ожидания видимости, даже в очереди FIFO, будет преднамеренно снова видимым в очереди.

В: Что такое несколько групп сообщений в очереди FIFO?Они похожи на разделы очереди?

Группа сообщений - это способ группировки сообщений, которые должны доставляться по порядку.

Допустим, есть две группы сообщений, A и B, и они отправляют сообщения в следующем порядке: A1, B1, A2, B2

Сообщение B1 может быть предоставлено, даже если A1 еще нетудален.Однако сообщение A2 будет не предоставлено до тех пор, пока A1 не будет удалено.Думайте о них как о «мини-очередях».Это позволяет обрабатывать большое количество сообщений, которые не связаны, без необходимости ждать всех предыдущих сообщений, которые будут удалены.

См .: Использование идентификатора группы сообщений Amazon SQS - Amazon SimpleСлужба очереди

1 голос
/ 20 марта 2019

В1. Будут ли оба приложения по отдельности получать по 100 сообщений каждое или сообщение, предоставленное одному потребителю, никогда не будет доставлено другому потребителю?

Ни один из них не является достаточно точным.

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

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

Потребители удаляют свои сообщения после обработки, в противном случае истекает их тайм-аут visibilitt, и они доставляются снова и снова - любому потребителю, которому удача розыгрыша доставляет их каждый раз. Как уже отмечалось, в SQS нет понятия идентичности или состояния потребителя. (В приложениях большого объема один потребитель может на самом деле иметь несколько подключений к SQS, причем все получающие сообщения параллельны, потому что обходы и циклы приема / удаления в сети в противном случае ограничат одного потребителя несколькими сотнями сообщений в секунду. эти соединения обрабатываются с использованием асинхронного ввода-вывода, потоков и т. д., не имеет значения для SQS, которому все равно, какой потребитель находится в данном соединении.)

Если вы хотите, чтобы все сообщения отправлялись всем потребителям, вам нужно разветвиться от SNS к SQS.

Q2: Тайм-аут видимости применим как к стандартной очереди, так и к очереди FIFO?

Да. Поскольку (отмеченное выше) соединение с SQS не является постоянным соединением с отслеживанием состояния, SQS использует тайм-аут видимости в качестве индикатора того, что потребитель потерял сообщение или ошибочно отказал, поэтому сообщение необходимо снова сделать доступным. (Очереди мертвых писем не позволяют этому происходить бесконечно, перемещая сообщение в другую очередь, поскольку повторяющиеся сбои указывают на проблему с потребителем или сообщение «ядовитая таблетка».)

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

Q3: Что такое несколько групп сообщений в очереди FIFO?

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

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

Доставка по заказу (простая иллюстрация) означает, что сообщение 2 не будет доставлено ни одному потребителю, пока сообщение 1 не будет получено и удалено - завершено - потребителем. В заказ доставка входит вся обработка (не только начальная «доставка»). Или, если 20 сообщений в очереди имеют одинаковый идентификатор группы и два потребителя запрашивают по 10 сообщений каждое, один потребитель получает 10, а другой ничего не получает - пока - потому что эти вторые 10 сообщений должны быть изолированы, пока первые 10 не будут обработано (иначе мы больше не "в порядке").

В сценарии с 20 сообщениями, если бы 14 были в группе A и 6 были в группе B, один потребитель получил бы A1-A10, A11-A14 был бы изолирован до тех пор, пока A1-A10 не был завершен, но пока первый потребитель занят у другого потребителя может быть B1-B6 одновременно.

Еще раз отметим, что нет привязанности к потребителю. Если A1-A10 и B1-B6 были удалены в одно и то же время, A11-A14 затем будет доставлен одному потребителю, но не обязательно тому, который обрабатывал A1-A10.

...