Отправка EventData в Azure Eventhub размером более 256 КБ

Мне нужно отправить некоторые данные в Eventhub, но они не проходят, потому что размер слишком велик. Есть ли способ сжать данные или какую-то команду, которая разбивает данные на части и присоединяет их к концентратору событий? Я использую следующий Java-код для отправки:

EventData sendEvent = new EventData(payloadBytes);
EventHubClient ehClient = EventHubClient.createFromConnectionStringSync(connStr.toString());
ehClient.sendSync(sendEvent);

Какие у меня варианты, если payloadBytes слишком велик?

3 ответа

Вы можете попробовать сжать отправляемое сообщение. Согласно документам, вы можете редактировать карту свойств внутри EventData:

      var eventData = new EventData(....);
eventData.getProperties().put("Compression","GZip");

Однако их решение у меня не сработало, и размер сообщений не уменьшился. Поэтому я сам сжал данные перед добавлением их в пакет:

      private EventData compressData(Data data) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    GZIPOutputStream gos = new GZIPOutputStream(baos);
    gos.write(new DefaultJsonSerializer().serializeToBytes(data)); # worth to create the seriazlier outside of this functions scope..
    gos.flush();
    gos.close();
    return new EventData(baos.toByteArray());
}

Другой подход - переключиться с базового уровня на стандартный, что позволяет отправлять события размером до 1 МБ. Документы Microsoft: квоты и ограничения - базовый и стандартный уровни.

Не могли бы вы описать, каков ваш вариант использования и какие данные вы собираетесь публиковать, это поможет найти правильное решение. Вот несколько общих опций, которые я использовал в своих проектах.

При проектировании системы, требующей брокера сообщений или потоковой передачи событий, следует учитывать некоторые факторы:

  • Концентратор событий предназначен для потоковой передачи событий, как описано здесь. Хорошо масштабируется, когда у вас огромное количество событий.

  • Ограничение 256 КБ на сообщение - это намного больше, чем обычно требуется для передачи событий, которые обычно основаны на тексте.

В моем проекте было два разных варианта использования, когда 256K было недостаточно, вот как я решил это:

  1. Нам нужно опубликовать внутреннее событие нашей монолитной системы, которое впоследствии может быть использовано нашими микросервисами извне. В большинстве случаев сообщения были небольшими, но иногда они превышали 256 Кбайт, и их было легко исправить, мы сжимали их перед публикацией и распаковывали в получателе. Вы можете найти хороший образец здесь.

  2. Во втором сценарии сообщения были размером больше 256 КБ, сжатие которого было недостаточным, я сначала создал блоб с этим контентом, а затем опубликовал событие со ссылкой на этот блоб, после чего получатель событий мог получить контент из блоба, независимо от того, насколько он большой.

Он должен охватывать большинство случаев использования, но дайте мне знать больше о вашей проблеме, если она бесполезна для вас.

Другие вопросы по тегам