Azure Event Hubs Geo-DR事件复制失败:提示命名空间为只读副本
问题分析与解决方案
核心误解:Geo-DR副命名空间的只读特性
Azure Event Hubs的Geo-DR(异地灾难恢复)配对机制,仅同步命名空间的元数据(比如事件中心、消费者组、权限配置等),不会自动复制事件数据。并且在故障转移发生前,被动状态的副命名空间处于完全只读状态,不允许任何写入操作——这就是你遇到InvalidSignature: This namespace is secondary and read-only错误的直接原因。
事件复制的正确姿势
你想实现主事件中心到副中心的事件同步,不能直接往Geo-DR的副命名空间写数据,可参考两种思路:
1. 用Event Hubs Federation实现跨区域事件复制
你参考的文档提到的Event Hubs Federation,就是专门用来做跨命名空间(包括跨区域)的事件转发/复制的。它允许你在主命名空间配置转发规则,自动将事件发送到目标命名空间的事件中心——这里的目标命名空间是独立的跨区域命名空间(非Geo-DR配对的副命名空间),处于可写状态,能实时接收复制的事件。当主命名空间故障时,你可以直接切换业务到这个跨区域的目标命名空间,完成灾难恢复。
2. 调整Geo-DR使用逻辑
如果坚持要用Geo-DR配对的副命名空间,事件复制只能在故障转移发生后进行:当主命名空间故障,触发故障转移让副命名空间变为活跃可写状态,再将主命名空间的剩余事件(若还能访问)复制到副中心。但这种方式属于事后补救,无法实现实时同步。
你的代码问题
代码直接尝试往Geo-DR的副命名空间写入事件,违反了被动副命名空间的只读限制。修复方向:
- 若用Federation:无需自己编写转发逻辑,直接在Azure门户配置主命名空间的Federation转发规则,让事件自动发送到目标可写命名空间的事件中心。
- 若要自定义复制逻辑:把目标改为独立的可写跨区域命名空间,调整
eventBufferClientFactory.CreateClient("Secondary")指向该独立命名空间的连接配置。
内容的提问来源于stack exchange,提问作者codeMonkey
相关产品推荐
相关产品推荐

