Ваши вопросы действительно попадают в суть теории очередей и процессов, поэтому я отвечу с этой точки зрения (RabbitMQ на самом деле является общим брокером сообщений в отношении моих ответов, поскольку это относится к любому брокеру сообщений).
Как осуществляется параллелизм в методе basic.get? Является ли вызов метода basic.get синхронизированным для обработки параллельных потребителей каждый с использованием собственного соединения и канала? C1, C2 и C3 вызывают вызов basic.get для получения сообщения одновременно (предположим, что сервер принимает все 3 запроса одновременно).
Ответ 1: RabbitMQ предназначен, чтобы быть надежным брокер сообщений. Он содержит внутренние процессы и элементы управления, чтобы гарантировать, что одно и то же сообщение не будет передаваться несколько раз различным потребителям. Теперь, из-за непрактичности тестирования сценария, который вы описываете, работает ли он отлично? Кто знает. Вот почему правильно разработанные приложения, использующие архитектуру на основе сообщений, будут использовать идемпотентные транзакции, так что если одна и та же транзакция обрабатывается несколько раз, результат будет таким же, как если бы транзакция была обработана один раз. Takeaway: спроектируйте ваше приложение так, чтобы ответ на этот вопрос был неважным.
C1 запрашивает сообщение с использованием basic.get и получает M1. Когда C2 запрашивает сообщение , так как он использует другое соединение, он снова получает M1 ?
Ответ 2: Нет С учетом предположений моего предыдущего ответа, RabbitMQ брокер не будет выполнять то же самое сообщение обратно, как только оно было доставлено. В зависимости от настроек канала и очереди сообщение может быть автоматически подтверждено при доставке и никогда не будет повторно отправлено. Другие настройки будут автоматически выдавать запрос сообщения «смерть» обрабатывающего потока/канала или отрицательное подтверждение из вашего потока обработки. Это важная функциональность, поскольку сообщение «яд» может неоднократно наносить ущерб вашему приложению, если оно может обслуживаться несколькими потребителями. Takeaway: вы можете смело полагаться на это предположение при разработке своего приложения.
Как потребители могут отправлять сообщения пакетами предопределенного размера?
Ответ: Они не могут, и не имеет смысла для них. В любой системе очередей основное предположение состоит в том, что элементы удаляются из очереди в одном файле. Попытки нарушить это предположение приводят к непредсказуемому поведению; кроме того, односекционный поток обычно является наиболее эффективным методом обработки. Однако в реальном мире есть случаи, когда размер партии> 1 необходим. В таких случаях имеет смысл загружать пакет в его собственное единственное сообщение, поэтому для этого может потребоваться отдельный поток обработки, который вытаскивает сообщения из очереди и объединяет их вместе или сначала помещает их в пакеты. Имейте в виду, что, когда у вас есть несколько потребителей, нет возможности гарантировать, что отдельные сообщения будут обработаны по порядку. Takeaway: Следует избегать дозирования, если это возможно, но там, где это невозможно, вы можете не предполагать, что партии будут содержать отдельные сообщения в любом конкретном порядке.
Непонятно, о чем вы спрашиваете. – pinepain
Второй момент - НЕТ. Другие моменты, которые я не понимаю! Что вы подразумеваете под «синхронизированными для обработки параллельных потребителей»! RMQ - это система FIFO, поэтому вы помещаете 3 сообщения, а C1 получаете первый, C2 - секунды и т. Д. Предполагая, что вы используете prefetch = 1. – Gabriele
Помог ли мой ответ ниже? Если да, отметьте это как ответ. Если нет, то как я могу разработать? – theMayer