Есть ли способ выполнять почасовую пакетную запись из Google Cloud Pub/Sub в Google Cloud Storage?

Я хочу хранить данные о событиях IoT в облачном хранилище Google, которое будет использоваться в качестве озера данных. Но делать вызов PUT для каждого события слишком дорого, поэтому я хочу добавить в файл, а затем выполнять вызов PUT в час. Как это сделать без потери данных в случае отказа узла в моей службе обработки сообщений?

Потому что, если моя служба обработки подтвердит сообщение, сообщение больше не будет в Google Pub/Sub, но также еще не будет в Google Cloud Storage, и в этот момент, если этот узел обработки выйдет из строя, я потеряю данные.

Мое желаемое использование аналогично этому сообщению, в котором говорится об использовании AWS Kinesis Firehose для пакетной обработки сообщений перед размещением в S3, но даже максимальный интервал пакетной обработки Kinesis Firehose составляет всего 900 секунд (или 128 МБ): https://aws.amazon.com/blogs/big-data/persist-streaming-data-to-amazon-s3-using-amazon-kinesis-firehose-and-aws-lambda/


comment
Получаете ли вы одно сообщение Pub/Sub для каждого события IoT? Можно ли продлить срок подтверждения для сообщений, обрабатываемых данным узлом, до тех пор, пока вы не будете готовы отправить файл? Затем, если узел умирает, по истечении срока подтверждения сообщения будут повторно доставлены другому подписчику в вашей службе обработки. По-прежнему существует проблема, заключающаяся в том, что вы не можете подтвердить все сообщения одновременно (если у вас достаточно много сообщений), поэтому вы можете получить повторяющиеся записи, если узел умирает после загрузки, но до подтверждения? Возможно, вы сможете решить эту проблему с помощью временных меток/именования объектов GCS.   -  person Travis Hobrla    schedule 08.06.2017


Ответы (1)


Если вы хотите постоянно получать сообщения из своей подписки, вам нужно будет отложить подтверждение сообщений до тех пор, пока вы не запишете их в Google Cloud Storage. Последние клиентские библиотеки в Google Cloud Pub/Sub автоматически продлевают срок подтверждения сообщений в фоновом режиме, если вы еще не подтвердили их.

В качестве альтернативы, что, если вы просто запускаете своего подписчика каждый час в течение некоторого времени? Каждый час вы можете запускать своего подписчика, получать сообщения, объединять их вместе, делать одну запись в облачное хранилище и подтверждать все сообщения. Чтобы определить, когда остановить подписку на текущий пакет, вы можете либо поддерживать его в течение определенного периода времени, либо отслеживать num_undelivered_messages через Stackdriver, чтобы определить, когда вы израсходовали большую часть ожидающих сообщений.

person Kamal Aboul-Hosn    schedule 15.06.2017
comment
Спасибо. Мне не приходило в голову запускать его раз в час. Это имеет смысл. - person gunit; 15.06.2017