我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶!

1 简介

GCP的Pubsub是一种异步消息传递服务,可将生产事件的服务与处理事件的服务隔离开。消息队列的作用就不多作介绍了,与Kafka、RabbitMQ等差不多。使用Pubsub一个重要原因是不用自己去管理整个中间件的运维,将专业的事交给专业的团队去做。这样,其实也是一种节约成本的方式。

GCP还提供了更低费用的Pubsub Lite,这里不多作介绍了。

2 概念

2.1 基本概念

一些重要的核心概念:

  • 主题:生产者向其发送消息的资源;
  • 订阅:单个特定主题的消息流资源,任何一个订阅都要从属于某个主题,对哪个主题感兴趣,就订阅哪个主题;
  • 消息:传输的数据和特性;
  • 发布者:也叫生产者,负责将消息发到主题;
  • 订阅者:也叫消费者,负责将消息从订阅中读取。

他们的关系:发布者发消息到某个特定主题,而主题下有一个或多个订阅,订阅者从订阅读取消息。所以发布者和订阅者的关系有如下:

  • 一对一;
  • 一对多;
  • 多对一;
  • 多对多。

如下图所示:

2.2 消息传递过程

整个消息传递的流程大致如下:

(1)发布者向主题发送消息,消息包含要发送的数据和消息的特性;

(2)系统收到消息后,会存在GCP的系统中;

(3)系统将主题的消息转发到订阅中去;

(4)Pubsub将消息推送给订阅者,或者订阅者拉取消息;

(5)订阅者收到信息后,返回Ack确认信息;

(6)Pubsub移除已确认的消息。

2.3 集成其它组件

整个GCP的Stack可以相互集成,其它组件如Pubsub集成如下:

3 Pubsub快速入门

3.1 使用gcloud命令行

使用SDK命令行工具gcloud的入门操作如下:

# 创建主题
$ gcloud pubsub topics create pkslow-topic # 创建订阅
$ gcloud pubsub subscriptions create pkslow-sub --topic=pkslow-topic # 发布消息
$ gcloud pubsub topics publish pkslow-topic --message="www.pkslow.com" # 接收消息
$ gcloud pubsub subscriptions pull pkslow-sub --auto-ack

3.2 使用客户端库

Pubsub支持的语言很丰富,包括Python、Java、C++、Go、Node.js、PHP等,一般项目都可以使用得上。之前的文章《整合Spring Cloud Stream Binder与GCP Pubsub进行消息发送与接收》讲解了Java的整合,这里先不再展开讲解。

4 消息排序

消息排序是一个很有用的特性,它能保证消息的顺序,即发布者发的是消息A-B-C-D,接收就应该是A-B-C-D,而不是A-B-D-C或其它。Pubsub的消息排序需要发布者和订阅者双方配合:

(1)发布者必须在发消息时指定排序键(Ordering Key),这个Key不是告诉Pubsub按什么排序,而是告诉Pubsub我哪些消息要排序。排序都是按时间的,Key的作用是同一个Key的所有消息都要排序。不同Key的消息,没有顺序关系,不需要排序。所以,要为需要按时间顺序的消息指定同一个Key。

(2)订阅需要打开排序特性,不然即使消息有Ordering Key,也不会排序。

排序特性是很有用的,但会带来性能的损伤。

遇到的一些难点:

(1)对于Java开发,Spring Cloud Stream还没有支持Pubsub排序功能,所以需要使用Google的SDK来开发,或者对Spring Cloud Stream进行改造。

(2)对于多消费者的情况,Pubsub会尽量把同一个Key的消息分发到一个消息者中以保证有序性。这样会造成在Auto Scale的情况下,有时难以让其它消费者捡起消息来消费,这个可以通过配置Outstanding的大小来控制。

5 其它

5.1 监控

GCP有成熟的监控套件Cloud Monitoring,我们直接用就可以了。可以查看发送了多少消息、多少消息待消费等。

5.2 消费者自动扩容

如果消费者的处理速度太慢,可以增加它的数量来解决问题。方案是根据Pubsub滞留的消息数来自动扩容。可以有两个方案,一个是利用Keda来做,另一个是利用Cloud Monitor来做。两者都是类似的,获取队列的大小,然后通过Kubernetes的HPA进行弹性伸缩。

Keda的相关文章可以看:《Kubernetes使用Keda进行弹性伸缩,更合理利用资源

6 总结

Pubsub使用起来还是挺简单的,毕竟只用写生产者和消费者即可。但细节也很多,有空再慢慢道来吧。


欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

多读书,多分享;多写作,多整理。

GCP消息队列Pubsub详解,简单好用还不用自己运维的更多相关文章

  1. 【FreeRTOS学习04】小白都能懂的 Queue Management 消息队列使用详解

    消息队列作为任务间同步扮演着必不可少的角色: 相关文章 [FreeRTOS实战汇总]小白博主的RTOS学习实战快速进阶之路(持续更新) 文章目录 相关文章 1 前言 2 xQUEUE 3 相关概念 3 ...

  2. WCF中队列服务详解

    WCF中队列服务详解 一.引言 在前面的WCF服务中,它都要求服务与客户端两端都必须启动并且运行,从而实现彼此间的交互.然而,还有相当多的情况希望一个面向服务的应用中拥有离线交互的能力.WCF通过服务 ...

  3. iOS的消息转发机制详解

    iOS开发过程中,有一类的错误会经常遇到,就是找不到所调用的方法,当然这类问题比较好解决,给当前对象或其父类对象添加该方法即可,使得编译器在编译时能正确找到该方法:或者,还有另外的方法,由于Objec ...

  4. spring websocket 和socketjs实现单聊群聊,广播的消息推送详解

    spring websocket 和socketjs实现单聊群聊,广播的消息推送详解 WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随 ...

  5. ActiveMQ学习总结(5)——Java消息服务JMS详解

    JMS: Java消息服务(Java Message Service) JMS是用于访问企业消息系统的开发商中立的API.企业消息系统可以协助应用软件通过网络进行消息交互. JMS的编程过程很简单,概 ...

  6. RabbitMQ消息队列(一): 简单队列

    1. 示例选用python的pika模块进行测试,需要预先安装pika模块: https://pypi.python.org/pypi/pika/0.10.0#downloads 上述地址下载源码,加 ...

  7. 跟我一起学WCF(11)——WCF中队列服务详解

    一.引言 在前面的WCF服务中,它都要求服务与客户端两端都必须启动并且运行,从而实现彼此间的交互.然而,还有相当多的情况希望一个面向服务的应用中拥有离线交互的能力.WCF通过服务队列的方法来支持客户端 ...

  8. Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息,handler详解

    MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android. ...

  9. .net微软消息队列(msmq)简单案例

    1.首先我们需要安装消息队列服务,它是独立的消息记录的服务,并保存在硬盘文件中. 我们添加名为:DMImgUpload的私有消息队列. 2.定义消息队列的连接字符串建议采用IP: (1)FormatN ...

随机推荐

  1. 自定义元类 __call__,__init__,__new__总结

    只要对象能被调用 产生对象的类里必然有__call__方法 在调用类时,必定先触发type里的__call__ __call__下有: 1.产生对象的object.__new__ 2..被调用的类自己 ...

  2. 统一UOS操作系统 修改源地址

    统一UOS操作系统 修改源地址 问题: 执行apt-get update的时候提示: root@sugon-PC:/etc/apt# apt-get update -y错误:1 https://uos ...

  3. 面向对象——python核心编程第二版

    类与实例 类与实例相互关联着:类是对象的定义,而实例是"真正的实物",它存放了类中所定义的对象的具体信息. class MyData(object): pass >>& ...

  4. CentOS7开放端口以及常用的使用命令记录整理

    CentOS7与以前常用的CentOS6还是有一些不同之处的,比如在设置开放端口的时候稍许有些不同,常用的iptables命令已经被firewalld代替.这几天正好有在CentOS7系统中玩Seaf ...

  5. python基础之常用模块一(sys、greenlet、pymysql、paramiko、pexpect、configparser)

    一.sys模块(内置模块) 用于提供对解释器相关的操作 import syssys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) ...

  6. python基础之包、模块、命名空间和作用域

    一.模块介绍 模块就是一组功能的集合体,我们的程序可以导入模块来复用模块里的功能. 模块的作用: (1)从文件级别组织程序,更方便管理:随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一 ...

  7. dd命令详解-(转自dkcndk)

    Linux-dd命令详解 dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换.名称: dd 使用权限: 所有使用者dd 这个指令在 ...

  8. STM32 KEIL 下的 printf 函数

    1 //加入以下代码,支持printf函数,而不需要选择use MicroLIB 2 #if 1 3 #pragma import(__use_no_semihosting) 4 //标准库需要的支持 ...

  9. Java注解类型(@Annotation)

    简述 注解本质是一个继承了Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类.而我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象$Proxy1.通过代理对象调 ...

  10. 【Azure 环境】Azure Key Vault (密钥保管库)中所保管的Keys, Secrets,Certificates是否可以实现数据粒度的权限控制呢?

    问题描述 Key Vault (密钥保管库) 能不能针对用户授权实现指定用户只能访问某个或某些特定的key? 如当前有两个用户(User1, User2),在Key Vault中有10个Key,Use ...