В соответствии с тем, что говорил Долан, есть несколько случаев, с которыми вы можете столкнуться:
- Время ожидания основного сообщения / аренды истекло, и вы снова получаете ВСЕ идентификаторы (из исходного сообщения). NSQ обеспечивает семантику "хотя бы один раз" .
- Время ожидания любого отдельного сообщения истекло и оно никогда не завершается (откат к основному IDS)
Поскольку nsq может (и большинство def будет: p) доставлять сообщения более одного раза, CreateObjects
может / должен быть идемпотентным для обработки этого случая.
Кроме того, повторная доставка является важным механизмом безопасности,
Исходное сообщение не должно быть найдено до тех пор, пока все индивидуальные идентификаторы или подтвержденные не будут созданы или успешно помещены в очередь, что гарантирует отсутствие потери данных.
IMO, как вы обрабатываете, выглядит совершенно неплохо, но наиболее важные соображения IMO обращаются с корректностью / целостностью данных в среде, где будут получены дубликаты сообщений .
Другой вариант может заключаться в том, чтобы пакетировать Requeue так, чтобы он пытался создать одно выходное сообщение с ошибочными идентификаторами, что могло бы сократить количество сообщений в очереди в любой момент времени:
Рассмотрим сообщение с 3 идентификаторами:
идентификаторы сообщений: [id1, id2, id3]
id1 успешно создается, а id2 и id3 завершаются ошибкой:
программа может выполнить все операции и выдать одно сообщение с требованием, с id2, id3.
Но компромисс с этим тоже.