Это звучит хрупко для меня: у вас есть веб-приложение, которое отправляет сообщения в очередь, а , а затем вставляет начальное состояние в базу данных.Что произойдет, если пользователь обработает сообщение до того, как веб-приложение сможет зафиксировать начальное состояние?
Что произойдет, если веб-приложение попытается вставить новое состояние, когда БД заблокирована потребителем?
Чтобы исправить это, веб-приложение должно добавить начальное состояние к сообщению , и потребитель должен быть единственным, кто когда-либо записывал в БД.
[EDIT] И вы также можете иметьпроблема с регистрацией.Проверьте, что гонки между веб-приложением и потребителем приводят к соответствующим ошибкам в журнале, помещая сообщение в очередь без изменения БД.
[EDIT2] Некоторые идеи:
Как насчет отображения только количества ожидающих задач?Для этого веб-приложение может записывать в таблицу 1, а потребитель записывает в таблицу 2, а администратор может показать разницу.
Почему веб-приложение не может видеть отложенные задачи, которые пользователь имеет в очереди?Может быть, у вас должно быть двух потребителей.Первый потребитель просто добавляет задачу в БД, фиксирует, а затем отправляет сообщение второму потребителю только с первичным ключом новой строки.Администратор iface может прочитать таблицу, пока второй потребитель пишет в нее.
Последняя идея: передайте транзакцию перед постановкой сообщения в очередь.Для этого вам просто нужно отправить «commit» в базу данных.Это будет выглядеть странно (и я, конечно, не рекомендую это для любого случая), но здесь, возможно, имеет смысл зафиксировать новую строку вручную (то есть, прежде чем вы вернетесь к своей среде, которая обрабатывает обычную логику транзакций).