我需要向 eventhub 发送一些数据,但由于数据太大而无法发送。有没有办法压缩数据或使用某些命令将数据分块并将其加入事件中心? 我正在使用以下 java 代码来发送:
EventData sendEvent = new EventData(payloadBytes);
EventHubClient ehClient = EventHubClient.createFromConnectionStringSync(connStr.toString());
ehClient.sendSync(sendEvent);
如果有效负载字节太大,我有什么选择?
另一种方法是从基本层切换到标准层,这允许您发送最大大小为 1MB 的事件。 Microsoft 文档:配额和限制 - 基本层与标准层。
您可以尝试压缩您发送的消息。根据 docs,您可以编辑 EventData 内的属性映射:
var eventData = new EventData(....);
eventData.getProperties().put("Compression","GZip");
但是,他们的解决方案对我不起作用,消息大小也没有减少。因此,在将数据添加到批次之前,我自己对数据进行了 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 serializer outside of this function's scope..
gos.flush();
gos.close();
return new EventData(baos.toByteArray());
}
您能否描述一下您的用例是什么以及您要发布什么类型的数据,这有助于找到正确的解决方案。以下是我在项目中使用的一些常见选项。
设计需要消息代理或事件流的系统时需要记住的一些问题:
事件中心专为事件流而设计,如此处所述。当您有大量事件时,它可以很好地扩展。
每条消息 256KB 的限制远远超过传输事件通常所需的限制,而事件通常是基于文本的。
在我的项目中,当 256K 不够用时,我有两个不同的用例,以下是我的解决方法:
我们需要发布单体系统的内部事件,稍后可以由外部的微服务使用。大多数情况下,消息都很小,但有时它们会比 256K 稍大,并且修复很容易,我们在发布之前压缩它们,并在接收者处解压缩它们。您可以在这里找到一个很好的样本。
在第二种情况下,消息远大于 256K,压缩是不够的,我所做的是首先使用该内容创建一个 Blob,然后通过引用该 Blob 发布事件,然后您的事件接收器可以从中获取内容斑点,无论有多大。
它应该涵盖大部分用例,但如果它对您没有用,请让我更多地了解您的问题。