【问题标题】:通过 Spring Cloud Stream 发布到 Pub/Sub 的持久性保证
【发布时间】:2020-11-09 03:50:19
【问题描述】:

我正在使用 Spring Cloud Stream 发送和接收来自 Google Pub/Sub 主题的消息,并且对发布有疑问。如果我有一个 @Output MessageChanel 并且我调用 channel.send(message) 并且调用正常返回(没有异常),我是否保证 Pub/Sub 现在有消息?我正在寻找类似于 JMS 系统中的“持久”消息保证的东西。

我似乎记得有可以为发布配置的批处理参数和/或异步设置,我还想知道这一切如何影响担保人(如果有的话)。这些似乎会使通过 channel.send 发送单个消息的任何保证变得复杂。

谢谢。

【问题讨论】:

    标签: google-cloud-pubsub spring-cloud-stream spring-cloud-gcp


    【解决方案1】:

    Cloud Pub/Sub 的 Spring 集成默认异步发布是正确的。在 Spring 集成级别,您可以使用 PubSubMessageHandler.setSync(boolean) setter 控制同步/异步切换。在那个级别,也可以在异步模式下设置发布回调。不幸的是,目前无法从 Spring Cloud Stream 集成中更改此标志。

    我有一个 PR 来添加第一个功能(关闭异步)--https://github.com/spring-cloud/spring-cloud-gcp/pull/2473

    【讨论】:

    • 谢谢@Elena Felder。
    • 所以只是为了确认我的理解,在aysnc模式下运行时可能会丢失消息,对吧?假设如果一个名为 channel.send 的程序正常返回,但是在异步线程有机会将消息发送到 pubsub 之前程序就死了?还有两个问题:同步操作会对性能造成多大影响,以及我们何时可以看到包含您的 PR 的新构建?
    • 是的,原则上异步模式下的消息丢失是可能的。为了模拟这种情况,启动一个示例应用程序(例如github.com/spring-cloud/spring-cloud-gcp/tree/master/…),关闭互联网并测试从示例 UI 发送消息。发件人代码将成功返回,但日志中会出现 DNS 解析警告。但是,对于新属性 spring.cloud.stream.gcp.pubsub.default.producer.sync,在默认的 10 秒超时后,相同的场景会导致 java.util.concurrent.TimeoutException
    • 1.2.4.RELEASE 应该会在接下来的两周内发布;我的目标是在那里获得 PR。
    • 所以冒着迂腐的风险,如果我在同步模式下运行并调用 channel.send 并且它正常返回(无异常),那么我能保证 PubSub 有消息吗?另外,还有一个问题:在异步模式下运行时,您是否看到任何静默故障,即无法将消息写入 PubSub,但日志中没有出现错误/异常?我正在尝试解决我们应用程序中的一些数据丢失问题,并尝试查看它是否在消息处理代码中。
    猜你喜欢
    • 2019-07-07
    • 2022-01-01
    • 1970-01-01
    • 2022-01-13
    • 2019-07-08
    • 2022-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    相关资源
    最近更新 更多