Я изучаю способы заказа списка сообщений из облачного паба / подписки Google. В документации написано:
Имеется способ определить из всех сообщений, которые он получил в настоящее время, есть ли еще сообщения, которые он еще не получил, которые он должен обработать первым.
... возможно с помощью Cloud Monitoring для отслеживания метрики pubsub.googleapis.com/subscription/oldest_unacked_message_age
. Подписчик временно помещает все сообщения в какое-то постоянное хранилище и проверяет сообщения. Он будет периодически проверять возраст самого старого неопознанного сообщения и сверяться с отметками времени публикации сообщений в хранилище. Все сообщения, опубликованные до самого старого неупакованного сообщения, гарантированно будут получены, поэтому эти сообщения могут быть удалены из постоянного хранилища и обработаны по порядку.
Я проверил это локально, и этот подход работает нормально.
У меня есть одно замечание, и я не могу легко это проверить.
В этом решении используется атрибут, присвоенный серверной стороне (от Google) publish_time
. Как Google избегает проблем с перекосом часов?
Если мой продюсер публикует сообщения A, а затем сразу B, как я могу быть уверен, что A.publish_time < B.publish_time
верно? Особенно с учетом того, что на той же странице документации упоминаются внутренние балансировщики нагрузки в архитектуре решения. Использует ли Google Pub / Sub атомные часы для синхронизации времени на самых первых компьютерах, которые видят сообщения и обогащают эти сообщения текущим временем?
В рекомендуемом решении есть неявное предположение, что часы на всех серверах синхронизированы. Но документация никогда не объясняет, правда ли это или как это достигается, поэтому я чувствую себя немного неловко по поводу решения. Работает ли он при очень высокой нагрузке?
Уведомление. Меня интересует только относительный порядок подтвержденных сообщений, публикуемых после друг друга. Если два сообщения публикуются одновременно, меня не волнует их порядок между собой. Это может быть A, B
или B, A
. Я только хочу убедиться, что если B публикуется после публикации A, то я могу отсортировать их в этом порядке при извлечении.
Является ли вышеупомянутое решение только «лучшим из возможных» или существуют реальные гарантии в отношении такого поведения?