- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何防止在 Google Cloud PubSub 中出现重复的消息?
比如说,我有一个代码可以处理它订阅的消息。
比如,我有 2 个节点具有具有此代码的相同服务。
一旦一个节点收到消息但尚未确认,另一个节点将收到相同的消息。这就是问题所在,我们有两个重复的消息。
void messageReceiver(PubsubMessage pubsubMessage, AckReplyConsumer ackReply) {
submitHandler.handle(toMessage(pubsubMessage))
.doOnSuccess((response) -> {
log.info("Acknowledging the successfully processed message id: {}, response {}", pubsubMessage.getMessageId(), response);
ackReply.ack(); // <---- acknowledged
})
.doOnError((e) -> {
log.error("Not acknowledging due to an exception", e);
ackReply.nack();
})
.doOnTerminate(span::finish)
.subscribe();
}
解决这个问题的方法是什么?这是正常行为吗?
最佳答案
Google Cloud Pub/Sub 使用“至少一次”交付。来自 the docs :
Typically, Cloud Pub/Sub delivers each message once and in the order in which it was published. However, messages may sometimes be delivered out of order or more than once. In general, accommodating more-than-once delivery requires your subscriber to be idempotent when processing messages.
这意味着它保证它会传递消息 1:N 次,因此如果您不通过其他首先删除重复数据的东西来传输消息,您可能会多次收到消息。没有您可以定义的设置来保证一次交付。文档确实提到您可以使用 Cloud Dataflow 的 PubSubIO
获得您想要的行为,但是 that solution appears to be deprecated :
You can achieve exactly once processing of Cloud Pub/Sub message streams using Cloud Dataflow
PubsubIO
. PubsubIO de-duplicates messages on custom message identifiers or those assigned by Cloud Pub/Sub.
综上所述,我实际上从未见过 Google Cloud Pub/Sub 发送消息两次。您确定这真的是您遇到的问题,还是因为您没有在确认截止日期(如上所述,默认为 10 秒)内确认该消息而重新发出消息。如果您不承认,它将被重新发行。来自 the docs (强调我的):
A subscription is created for a single topic. It has several properties that can be set at creation time or updated later, including:
- An acknowledgment deadline: If your code doesn't acknowledge the message before the deadline, the message is sent again. The default is 10 seconds. The maximum custom deadline you can specify is 600 seconds (10 minutes).
如果是这种情况,只需在截止日期前确认您的消息,您就不会经常看到这些重复消息。
关于java - Google PubSub 和来自 TOPIC 的重复消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53823366/
对新版本 com.google.cloud.pubsub.spi.v1.Publisher.publish(pubsubMessage).get() 的调用永远挂起。我不确定问题是什么。 代码片段:
根据这里:https://cloud.google.com/pubsub/docs/reference/rest/v1/PubsubMessage 当发布者向队列发送消息时,不应填充时间戳字段。所以这
Google PubSub 是否适合小批量(10 条消息/秒)但任务关键型消息传递,保证在任何固定时间段内及时传递每条消息? 或者,它是否更适合高吞吐量,其中个别消息可能偶尔会丢失或无限期延迟? 编辑
我们创建了一个 pull使用 GCP Web GUI 的默认确认截止时间为 10 秒的 PubSub 订阅。原来是我们太乐观了,我们的服务处理一批拉取的消息需要10多秒的时间。该服务不会抛出异常,它实
批处理 pubsub 请求的 NODEJS 示例代码如下所示: // Imports the Google Cloud client library const PubSub = require(`@
在 Google PubSub 中,可以异步调用来自客户端的发布调用。因此,我认为可以同时触发多个发布请求并将其发送到服务器,尤其是在批处理阈值太低的情况下。 如果这是真的,pubsub 客户端如何控
根据堆栈驱动程序图表,我们开始注意到某个主题/订阅的“未确认消息”数量不时增加。 症状 我不知道我们可以信任多少堆栈驱动程序图表,但我已经检查过: 拉取操作数与发布操作数一样多 问题发生时ack操作计
我有一个将数据写入 Google Cloud pubsub 的应用程序,根据 pubsub 的文档,由于重试机制导致的重复是偶尔会发生的事情。还有乱序消息的问题,这在 pubsub 中也不能保证。 另
我有一个包含多个拉取订阅的 pubsub 主题。我想要某种机制,我可以在其中发布带有“优先级”标签的消息,使消息尽可能地跳到队列的前面。 我不需要任何有保证的排序语义,只需要“尽力而为”的优先级机制。
我在我们的平台中集成了 GMB API,并与 PubSub 合作以获取实时评论通知。 为此,我已经完成了以下步骤: Created topic在谷歌 PubSub 云上。 创建了它的 subscrip
试图找出在本地测试 PubSub 推送端点的最佳方法。我们尝试过使用 ngrok.io,但您必须拥有域才能加入白名单(这样做的工具也已损坏……导致无限重定向循环)。我们还尝试在本地模拟 PubSub。
我们希望通过带有 pubsub 触发器 ( https://firebase.google.com/docs/functions/pubsub-events ) 的 firebase 云函数接收有关某
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 2年前关闭。 Improve t
我有一个向 PubSub 主题发布消息的简单服务,偶尔会收到“已超过截止日期”错误消息: GaxError(RPC failed, caused by ) Python代码: from google.
我的应用程序发布少量消息(最多每几秒 1 条)。它不订阅。 首次使用时,PubSub 会创建 60 个永久保持事件状态的线程,如下所示: "grpc-default-worker-ELG-1-1 Id
我想检查运行代码是否有权在特定项目中执行“pubsub.topics.list”。这段代码: try (TopicAdminClient admin = getTopicAdmin()) {
我正在开发微博 spring mvc hibernate 应用程序。我需要实现像推特这样的发布订阅功能。 我正在使用 RabbitMQ 通过 Spring AMQP 抽象进行消息传递。 我在网络上到处
我对 Airflow 很陌生,并尝试使用 apache Airflow 与 google pubsub 的集成,我猜它是添加到“Airflow-300”JIRA 下的。如果我在这里阅读不正确,请纠正我
我正在学习 https://www.woolha.com/tutorials/node-js-google-cloud-pub-sub-basic-examples 上的教程并且有一些困难.. 我在
我在我的 .net 核心微服务中使用 DAPR 和 Docker。我在 docker-compose.yml 中进行了以下配置以运行代理和 dapr pubsub 配置。 PUBSUB.yml api
我是一名优秀的程序员,十分优秀!