Роман Мирр, нужно брать бд с поддержкой транзакций. Открыли транзакцию
Заблокировали строчку
Отправили пуш
Пометили отправленным в базе
Закрыли транзакцию
Если где-то посередине консьюмер упал, то транзакция откатится. Худшая ситуация - повторная отправка пуша. Но она и в варианте с очередью есть.
Но опять же, я не вижу смысла в хранении статуса здесь. Статистику по пушам может показать и сервис по отправке пушей.
Роман Мирр, суть моего решения в том чтобы избавиться от этой необходимости. Есть что-то в очереди = нужно что-то отправить. Ничего нет в очереди = всё уже отправлено.
А если хочется хранить состояние отправки каждого пуша то надо не использовать очередь а взять базу данных и писать туда все что угодно.
Даже без просмотра il был уверен, что в первом случае 2 вызова будет, ибо il соответствует написанному полностью
Я просто не уверен что могу всегда точно представить себе IL код. Тут ведь такая ситуация, можно примерно представлять себе его, и этого будет хватать, пока все нормально работает. А когда хочется сделать побыстрее, то всё равно лезешь и в IL и в профилировщик и в бенчмарки, чтобы быть точно уверенным.
Есть вероятность что консьюмер упадет во время работы. Если он не фиксирует, кому он уже сообщения отправил, или отправил пуши и упал зафиксировав это, то будут дубли пушей. Опять же, если фиксировать последнего отправленного, то нужно гарантировать порядок выдачи списка с пользователями на базе данный. Если user_id - гуид, например, то нужно будет вводить какой-то доп. идентификатор для этих целей.
Если решать эту проблему, используя утверждение "есть в очереди = пуш не отправлен", то не надо ничего сохранять. В очередь пишем пары post_id + массив user_id. В этом случае можно парралелить консьюмеров и никакой порядок не важен.
Василий Банников, может напишите свой ответ? Я описал свой личный опыт. Даже если он противоречит вашему, прошлый опыт не поменяется. Когда я начинал, я не мог выучит новую библиотеку за 2 дня. Сейчас такое может происходить. Но в начале, когда я получал тестовые задания, любое новая технология для меня была проблемой.
Александр Кубинцев, кластеризация уже не кажется мне хорошей идеей. Это был быстрый ответ, который не вполне учитывал специфику postgres, а именно то что полноценного cluster index в нём нет. Но вот идея с покрывающим индексом может помочь.