Zhonghui

每个不曾起舞的日子,都是对生命的辜负

User Tools

Site Tools


软件:linux:pubsub

GCP: Pub/Sub

https://cloud.google.com/pubsub?hl=en_us

AI:Google Cloud 的托管消息队列/事件总线,让发布者(Publisher)把消息发到 Topic,订阅者(Subscriber)通过 Subscription 异步接收。Pub/Sub 是一条事件高速路:发布者把消息丢到一个主题(Topic),系统把它投递到一个或多个订阅(Subscription),由订阅者(Subscriber)取走处理。

大概是一个队列


总览


linux_gcp_pubsub_overall.xml.txt

  1. Topic是入口,向里面推送数据
  2. Subscriptions是出口,从其中取出数据
  3. Topic → Subscriptions,是一对多的关系
  4. Push和Pull的区别是:推送 or 轮询
  5. 一个 Subscription 可以看作一个独立的消息出口,一个消息从 Topic 进入,需要被所有的连接的 Subscriptions 都处理完成后,才算生命周期结束
  6. 但是一个 Subscription 可以有多个 Workers,只需要一个 Worker 把消息处理了,这个 Subscription 的处理就算结束了
  7. 处理完消息之后,需要发送ACK回复确认处理完成

消息的唯一性

每个消息都完整地传递到每一个 Subscriptions
每一个 Subscriptions 的其中,有且只有一个 Worker 收到并处理了消息

概念[AI]

  1. Publisher(发布者):发送消息的应用/服务。
  2. Topic(主题):消息的入口/频道。所有要发的消息,先发到它上面。
  3. Message(消息):要传递的数据本体(字节/字符串)+属性 attributes(键值对,用来过滤或路由)+系统生成的ID。
  4. Subscription(订阅):Topic 到接收者之间的投递点。同一个 Topic 可以挂很多 Subscription;每个 Subscription 都会收到一份消息的副本。
  5. Subscriber(订阅者):真正处理消息的应用/服务实例。
  6. Pull(拉取):订阅者主动去 Pub/Sub 拉消息的方式。优点:易控制并发/速率;缺点:需要常驻进程。
  7. Push(推送):Pub/Sub 主动把消息HTTP POST到你的回调 URL。优点:拿来即用;注意要验证来源、处理超时与重试。
  8. ACK(确认/签收):订阅者处理完消息后给 Pub/Sub 的签收。没 ACK 或超时,消息会重投(所以要写成幂等)。
  9. At-least-once(至少一次投递):官方保证“至少送到一次”,但可能重复;你的处理逻辑要能去重/幂等
  10. Ordering Key(排序键):给消息打上同一个 key,可按键内顺序投递(不同 key 之间不保证)。
  11. DLQ(死信队列):多次投递仍失败的消息会被转发到的“隔离箱”Topic,用于后续排错/补偿。
  12. Filter(过滤器):在 Subscription 侧按消息属性筛选,只接收需要的那部分消息。

最小工作流程[AI]

  1. 建 Topic(创建消息入口)
  2. 建 Subscription(为每类消费者建一个投递点,可选 Push 或 Pull)
  3. 发布消息(Publisher 发到 Topic,消息被“复印”到所有订阅里)
  4. 消费消息并 ACK(Subscriber 用 Pull 拉取,或等待 Push 回调;处理完要 ACK)
  5. 失败与重试(没 ACK 会重投;多次失败可路由到 DLQ;需要顺序就使用 Ordering Key)

理解消息的分摊[AI]

Topic T
  ├─ Subscription S1  ──>  Worker A, Worker B, Worker C   (同一个订阅里的多个“订阅者实例”)
  └─ Subscription S2  ──>  Worker X                       (另一个订阅)

同一个 Subscription 内部:分摊(负载均衡)

每条消息在 S1 内只会被一个 Worker 处理一次(A 或 B 或 C 其中之一)。
用语:这是在一个订阅“队列”里做分摊/负载均衡。
若处理失败未 ACK,消息会在 S1 内重投,可能换到别的 Worker 再试。

不同 Subscription 之间:各拿一份副本(广播/扇出)

同一条消息会被复制到 S1 和 S2 各自的队列里。
所以 S1 处理一份,S2 也处理一份,互不影响。

参考代码

一定要在本地先配置好 ADC 之后才能运行,参考gcloud CLI
https://github.com/GZhonghui/GCP/tree/master/pub_sub/python

可以在网页端查看现有的消息:

gcloud命令

参考gcloud CLI,先配置好权限

# 以下命令暂未验证
 
# 列 Pub/Sub 主题
gcloud pubsub topics list
 
# 列当前项目所有订阅(带完整路径)
gcloud pubsub subscriptions list --format="value(name)"
 
# 只想看短名
gcloud pubsub subscriptions list --format="value(name.basename())"
 
# 创建 topics 和 subscriptions
gcloud pubsub topics create my-topic
gcloud pubsub subscriptions create my-sub --topic=my-topic
 
# 发布消息
gcloud pubsub topics publish my-topic --message="hello" --attribute=env=dev
gcloud pubsub topics publish YOUR_TOPIC --message="hello ADC" \
  --attributes=foo=bar,lang=zh
 
# 拉取消息
gcloud pubsub subscriptions pull my-sub --auto-ack --limit=10
/var/www/DokuWikiStick/dokuwiki/data/pages/软件/linux/pubsub.txt · Last modified: 2025/09/22 13:44 by zhonghui