针对事件中心的 Apache Kafka 故障排除指南
本文提供的故障排除技巧适用于你在使用适用于 Apache Kafka 的事件中心时可能会遇到的问题。
服务器繁忙异常
由于 Kafka 限制,你可能会收到“服务器忙”异常。 使用 AMQP 客户端时,事件中心会在遇到服务限制时立即返回“服务器忙”异常。 它相当于“稍后重试”消息。 在 Kafka 中,消息在完成前会存在延迟。 将在生成/提取响应中以 throttle_time_ms
形式返回延迟时间长度(以毫秒为单位)。 大多数情况下,系统不会在事件中心仪表板上将这些延迟的请求记录为“服务器忙”异常, 而是使用响应的 throttle_time_ms
值来指示吞吐量已超出预配的配额。
如果流量过多,服务会出现以下行为:
- 如果生成请求的延迟超过请求超时 (request.timeout.ms),事件中心会返回“策略冲突”错误代码。
- 如果提取请求的延迟超过请求超时,事件中心会将请求记录为“受限制”并以空记录集进行响应,不返回错误代码。
专用群集没有限制机制。 你可以自由地使用所有群集资源。
未收到记录
你可能会看到,使用者未收到任何记录,并且会不断地重新进行平衡。 在这种情况下,使用者不会获得任何记录,只会不断地重新进行平衡。 它发生时没有异常或错误,但 Kafka 日志会显示使用者在尝试重新加入组和分配分区时处于停滞状态。 此问题有多种可能的原因:
- 确保
request.timeout.ms
至少为建议值 60000,session.timeout.ms
至少为建议值 30000。 这些设置过低可能会导致使用者超时,超时会导致重新平衡(重新平衡又会导致超时,而超时又会导致重新平衡,陷入一个死循环) - 如果你的配置与这些建议的值相符,而你仍然看到系统在不断地进行重新平衡,则请提交问题(请确保在问题中提供完整的配置,方便我们进行调试)!
压缩/消息格式版本问题
Kafka 的事件中心目前仅支持 gzip
压缩算法。 如果使用任何其他算法,客户端应用程序将看到消息格式版本错误(例如,The message format version on the broker does not support the request.
)。
如果需要使用不受支持的压缩算法,请在将数据发送到中转站之前使用该特定算法压缩数据,在接收数据之后再将其解压缩,这是一种有效的解决方法。 消息正文只是发送给服务的字节数组,因此客户端压缩/解压缩不会导致任何问题。
UnknownServerException
你可能会收到一个 Kafka 客户端库中的 UnknownServerException,类似于以下示例:
org.apache.kafka.common.errors.UnknownServerException: The server experienced an unexpected error when processing the request
向 Azure 支持提交票证。 在调试问题时,调试级别的日志记录和异常时间戳 (UTC) 很有用。
其他问题
如果在事件中心使用 Kafka 时遇到问题,请检查以下项。
- 防火墙阻止流量 - 确保防火墙未阻止端口 9093。
- TopicAuthorizationException - 此异常的最常见原因包括:
- 配置文件中的连接字符串中有拼写错误,或者
- 尝试在“基本”层命名空间中使用用于 Kafka 的事件中心。 基本层不支持适用于 Kafka 的事件中心的功能。
- Kafka 版本不匹配 - 用于 Kafka 生态系统的事件中心支持 Kafka 1.0 及更高版本。 某些使用 Kafka 0.10 及更高版本的应用程序有时可能会有效,因为 Kafka 协议具有后向兼容性,但我们强烈建议你不要使用旧的 API 版本。 Kafka 0.9 及更低版本不支持必需的 SASL 协议,因此无法连接到事件中心。
- 与 Kafka 配合使用时,AMQP 标头上出现奇怪的编码 - 通过 AMQP 将事件发送到事件中心时,系统会采用 AMQP 编码来序列化任何 AMQP 有效负载标头。 Kafka 使用者不会反序列化 AMQP 中的标头。 若要读取标头值,请手动解码 AMQP 标头。 或者,如果你知道要通过 Kafka 协议来使用 AMQP 标头,则可避免使用这些标头。 有关详细信息,请参阅此 GitHub 问题。
- SASL 身份验证 - 将框架与事件中心所需的 SASL 身份验证协议配合使用可能不是看起来那么容易。 看看你是否可以在 SASL 身份验证的基础上使用框架的资源来排查配置问题。
限制
我们可以将 Apache Kafka 与事件中心 Kafka 进行比较。 大多数情况下,Azure 事件中心的 Kafka 接口的默认值、属性、错误代码和常规行为与 Apache Kafka 的相同。 下面列出了这二者明显不同的情况(或事件中心施加了某个限制而 Kafka 没有施加该限制的情况):
group.id
属性的最大长度为 256 个字符offset.metadata.max.bytes
的最大大小为 1024 个字节- 偏移提交数限制为每个分区 4 个调用/秒,内部日志最大大小为 1 MB
后续步骤
若要详细了解事件中心和适用于 Kafka 的事件中心,请参阅以下文章: