为什么消息在确认后仍会继续被拉取?
Why does message keep getting pulled even after ack'ing it?
(env) user@cloudshell:~ (project-id)$ gcloud pubsub topics create Topic
Created topic [projects/project-id/topics/Topic].
(env) user@cloudshell:~ (project-id)$ gcloud pubsub subscriptions create Sub --topic=Topic
Created subscription [projects/project-id/subscriptions/Sub].
(env) user@cloudshell:~ (project-id)$ gcloud pubsub topics publish Topic --message=A
messageIds:
- '1187813469495553'
(env) user@cloudshell:~ (project-id)$ gcloud pubsub subscriptions pull Sub
Listed 0 items.
(env) user@cloudshell:~ (project-id)$ gcloud pubsub subscriptions pull Sub
┌──────┬──────────────────┬────────────┬──────────────────┬────────────────┐
│ DATA │ MESSAGE_ID │ ATTRIBUTES │ DELIVERY_ATTEMPT │ACK_ID │
├──────┼──────────────────┼────────────┼──────────────────┼────────────────┤
│ A │ 1187813469495553 │ │ │ ack-ID-1 │
└──────┴──────────────────┴────────────┴──────────────────┴────────────────┘
(env) user@cloudshell:~ (project-id)$ gcloud pubsub subscriptions ack Sub --ack-ids=ack-ID-1
Acked the messages with the following ackIds: [ack-ID-1]
{}
(env) user@cloudshell:~ (project-id)$ gcloud pubsub subscriptions pull Sub
┌──────┬──────────────────┬────────────┬──────────────────┬────────────────┐
│ DATA │ MESSAGE_ID │ ATTRIBUTES │ DELIVERY_ATTEMPT │ ACK_ID │
├──────┼──────────────────┼────────────┼──────────────────┼────────────────┤
│ A │ 1187813469495553 │ │ │ ack-ID-2 │
└──────┴──────────────────┴────────────┴──────────────────┴────────────────┘
(env) user@cloudshell:~ (project-id)$ gcloud pubsub subscriptions pull Sub
┌──────┬──────────────────┬────────────┬──────────────────┬────────────────┐
│ DATA │ MESSAGE_ID │ ATTRIBUTES │ DELIVERY_ATTEMPT │ ACK_ID │
├──────┼──────────────────┼────────────┼──────────────────┼────────────────┤
│ A │ 1187813469495553 │ │ │ ack-ID-3 │
└──────┴──────────────────┴────────────┴──────────────────┴────────────────┘
确认唯一一条已发布的消息后,队列不应该为空吗?
当对订阅执行拉取时,消息在被确认 (acked) 之前不会被视为已检索。一个人只能在拉动之后确认一条消息。当从订阅中提取一条消息时,将启动一个计时器(在 Pub/Sub 内)。 必须在此计时器间隔内确认消息。否则,消息被视为未确认。
在我们这里的示例中,当我们执行 gcloud
命令来拉取消息时,如果我们不执行后续 gcloud
ack 命令 before interval已经过期,那么ack请求就没有效果了。我们有能力使用自动确认执行拉取,这意味着拉取也会立即确认消息。如果我们想要执行显式确认,我们必须在确认超时间隔内执行。
(env) user@cloudshell:~ (project-id)$ gcloud pubsub topics create Topic
Created topic [projects/project-id/topics/Topic].
(env) user@cloudshell:~ (project-id)$ gcloud pubsub subscriptions create Sub --topic=Topic
Created subscription [projects/project-id/subscriptions/Sub].
(env) user@cloudshell:~ (project-id)$ gcloud pubsub topics publish Topic --message=A
messageIds:
- '1187813469495553'
(env) user@cloudshell:~ (project-id)$ gcloud pubsub subscriptions pull Sub
Listed 0 items.
(env) user@cloudshell:~ (project-id)$ gcloud pubsub subscriptions pull Sub
┌──────┬──────────────────┬────────────┬──────────────────┬────────────────┐
│ DATA │ MESSAGE_ID │ ATTRIBUTES │ DELIVERY_ATTEMPT │ACK_ID │
├──────┼──────────────────┼────────────┼──────────────────┼────────────────┤
│ A │ 1187813469495553 │ │ │ ack-ID-1 │
└──────┴──────────────────┴────────────┴──────────────────┴────────────────┘
(env) user@cloudshell:~ (project-id)$ gcloud pubsub subscriptions ack Sub --ack-ids=ack-ID-1
Acked the messages with the following ackIds: [ack-ID-1]
{}
(env) user@cloudshell:~ (project-id)$ gcloud pubsub subscriptions pull Sub
┌──────┬──────────────────┬────────────┬──────────────────┬────────────────┐
│ DATA │ MESSAGE_ID │ ATTRIBUTES │ DELIVERY_ATTEMPT │ ACK_ID │
├──────┼──────────────────┼────────────┼──────────────────┼────────────────┤
│ A │ 1187813469495553 │ │ │ ack-ID-2 │
└──────┴──────────────────┴────────────┴──────────────────┴────────────────┘
(env) user@cloudshell:~ (project-id)$ gcloud pubsub subscriptions pull Sub
┌──────┬──────────────────┬────────────┬──────────────────┬────────────────┐
│ DATA │ MESSAGE_ID │ ATTRIBUTES │ DELIVERY_ATTEMPT │ ACK_ID │
├──────┼──────────────────┼────────────┼──────────────────┼────────────────┤
│ A │ 1187813469495553 │ │ │ ack-ID-3 │
└──────┴──────────────────┴────────────┴──────────────────┴────────────────┘
确认唯一一条已发布的消息后,队列不应该为空吗?
当对订阅执行拉取时,消息在被确认 (acked) 之前不会被视为已检索。一个人只能在拉动之后确认一条消息。当从订阅中提取一条消息时,将启动一个计时器(在 Pub/Sub 内)。 必须在此计时器间隔内确认消息。否则,消息被视为未确认。
在我们这里的示例中,当我们执行 gcloud
命令来拉取消息时,如果我们不执行后续 gcloud
ack 命令 before interval已经过期,那么ack请求就没有效果了。我们有能力使用自动确认执行拉取,这意味着拉取也会立即确认消息。如果我们想要执行显式确认,我们必须在确认超时间隔内执行。