您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Go语言

go 语言实现发布订阅模式

时间:2019-07-29 17:37:43  来源:  作者:

tendermint 中用到了订阅发布模式,这种模式大家都不会陌生,比如你打开你的微信订阅号,你订阅的作者发布的文章,会广播给每个订阅者。在这个场景里,微信公众号就是一个Pulisher,而你就是一个Subscriber,你收到的文章就是一个Message。

今天不过多讨论 tendermint 的业务流程,主要和大家聊一下如何使用 go 语言写一个订阅发布模式。下面这个图是 tendermint 中发布订阅模式的草图:

go 语言实现发布订阅模式(tendermint 源码阅读)

发布订阅模式

 

接下来我再介绍几个重要的数据结构:

type state struct {
 // query string -> client -> subscription
 subscriptions map[string]map[string]*Subscription
 // query string -> queryPlusRefCount
 queries map[string]*queryPlusRefCount
}

state 是用来维护所有 subscriber,当需要 publish 时,遍历这个对象中的两个 map,找到需要通知的 Subscription,然后通知。我们接着看其他数据结构:

type Server struct {
 cmn.BaseService
​
 cmds chan cmd
 cmdsCap int
 // check if we have subscription before
 // subscribing or unsubscribing
 mtx sync.RWMutex
 subscriptions map[string]map[string]struct{} // subscriber -> query (string) -> empty struct
}

这个结构中我们主要看 cmds 这个 channel,当我们有新的订阅时,我们向这个 channel 中发送一个数据。subscriptions 这个结构也维护了所有的订阅者的信息,有新的订阅时,首先检查一下之前是否已经订阅过,如果有,就返回对应错误信息。

type cmd struct {
 op operation
​
 // subscribe, unsubscribe
 query Query
 subscription *Subscription
 clientID string
​
 // publish
 msg interface{}
 tags map[string]string
}

上面这个是 cmds 的结构,在 channel 中发送这个类型的数据, query:

type Query interface {
 Matches(tags map[string]string) bool
 String() string
}

这个里面有两个接口,一个是返回 string,另外一个就是判断是否相同。这里她的作用就是类似于 tag,我们订阅时,需要指定我们关注的类型,可以理解为 tag,发布时也是如此,发布对应 tag 的消息。其中 Matches 中,传入一个 map,根据其算法实现匹配,这里我们不深追这个算法,我们可以理解为,订阅时,我们生成了一个 query 的对象,发布时要说明发布的消息的类型,或者可以说是具有某种 tag 的消息,然后对比 query 对象,匹配上就发送消息。

到这里我们订阅模式的各种结构基本上都聊了一下,还有 EventBus 部分没有细说,这部分主要就是和业务相关的了,所以我们这里留在后面的文章写,还有 tendermint 是如何使用上面的发布订阅模式也在下一篇文章中和大家分享。


最后啰嗦几句,我一直都是非常推荐大家平时多阅读源码的,很多东西虽然我们通过理论可以学习到,但是动手实现就是另一回事了,尤其是很多时候我们自己动手实现的东西都是为了理解这个内容而实现的,很多是不能够在项目中应用的,这时候我们能够阅读著名项目的源码,就事半功倍了。

后续会写更过关于源码的分享,希望大家持续关注,你的在看是我码字的动力(所有文章均是个人一个字一个字敲出来的,如有失误之处,敬请大家谅解,更多内容可以关注公众号:Go语言之美)。



Tags:go 语言   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
作为开发人员,微信生态我们不能无视,微信提供的开放能力,我们应该有所了解。微信支付作为重要的一部分,平时工作中可能难免会遇到。Go 作为一门新语言,微信支付没有提供 Go 的 SD...【详细内容】
2020-09-04  Tags: go 语言  点击:(52)  评论:(0)  加入收藏
Go语言开发团队花了很长时间来解决当今软件开发人员面对的问题。开发人员在为项目选择语言时,不得不在快速开发和性能之间做出选择。C和C++这类语言提供了很快的执行速度,而Ru...【详细内容】
2020-08-27  Tags: go 语言  点击:(53)  评论:(0)  加入收藏
在 2 世纪, 发送机密消息的一个有效方法就是对每个字母进行位移, 使得 'a' 变为 'd' , 'b' 变为 'e' , 依次类推。 这样处理产生的结果看上去...【详细内容】
2020-08-11  Tags: go 语言  点击:(60)  评论:(0)  加入收藏
大家好,从今天起,我们一起来学习 Echo 框架。这几年,随着 Go 语言的发展,各种 Web 框架也出现了。常言道:没有选择是一种无奈,有选择是一种痛苦。所以,大家总是问:Web 框架大佬推荐...【详细内容】
2020-06-30  Tags: go 语言  点击:(78)  评论:(0)  加入收藏
背景介绍直播系统主要是以内容为主,好的内容可以吸引用户来欣赏,也能为公司带来可观的收益,既然有传播的入口,那么必然有负面内容的出现,随着平台用户量不断扩大,内容的监管也是必...【详细内容】
2020-06-02  Tags: go 语言  点击:(60)  评论:(0)  加入收藏
每到节假日和过年,需要外出通行的人几乎都会遇到一个问题:抢火车票!当全国上亿人都在固定的时间段抢票,服务器动辄就要承受上百万级并发的情况时,你就会明白,一个支持高并发的服务...【详细内容】
2020-05-10  Tags: go 语言  点击:(63)  评论:(0)  加入收藏
编写健壮且高性能的网络服务需要付出大量的努力。提高服务性能的方式有很多种,比如优化应用层的代码,更进一步,还可以看看垃圾回收器,操作系统,网络传输,以及部署我们服务的硬件是否有优化空间。...【详细内容】
2019-12-30  Tags: go 语言  点击:(76)  评论:(0)  加入收藏
反射是 Go 语言比较重要的一个特性之一,虽然在大多数的应用和服务中并不常见,但是很多框架都依赖 Go 语言的反射机制实现一些动态的功能。作为一门静态语言,Golang 在设计上都...【详细内容】
2019-11-20  Tags: go 语言  点击:(195)  评论:(0)  加入收藏
我终于又开始使用 Go 语言编程了。虽然我在前两年多的时间里积极参与这个项目,但从 2012 年起,我就基本没有参加过这个项目。最初,我之所以做出贡献,是因为我是贝尔实验室 Plan...【详细内容】
2019-09-23  Tags: go 语言  点击:(109)  评论:(0)  加入收藏
这篇文章是来自最新 justforfunc 中同标题的一段。这个程序的代码可以在 justforfunc 仓库 中找到。问题陈述想象一下,对于下面的代码段,你如何将其中所有的标识符都提取出来...【详细内容】
2019-08-07  Tags: go 语言  点击:(246)  评论:(0)  加入收藏
▌简易百科推荐
zip 是一种常见的归档格式,本文讲解 Go 如何操作 zip。首先看看 zip 文件是如何工作的。以一个小文件为例:(类 Unix 系统下)$ cat hello.textHello!执行 zip 命令进行归档:$ zip...【详细内容】
2021-12-17  Go语言中文网    Tags:Go语言   点击:(13)  评论:(0)  加入收藏
大家好,我是 polarisxu。前段时间,Russ Cox 明确了泛型相关的事情,原计划在标准库中加入泛型相关的包,改放到 golang.org/x/exp 下。目前,Go 泛型的主要设计者 ianlancetaylor 完...【详细内容】
2021-11-30  Go语言中文网    Tags:slices 包   点击:(24)  评论:(0)  加入收藏
前言最近因为项目需要写了一段时间的 Go ,相对于 Java 来说语法简单同时又有着一些 Python 之类的语法糖,让人大呼”真香“。 但现阶段相对来说还是 Python 写的多一些,偶尔还...【详细内容】
2021-11-25  crossoverJie    Tags:Go   点击:(29)  评论:(0)  加入收藏
go-micro是基于 Go 语言用于开发的微服务的 RPC 框架,主要功能如下:服务发现,负载均衡 ,消息编码,请求/响应,Async Messaging,可插拔接口,最后这个功能牛p安装步骤安装proto...【详细内容】
2021-09-06    石老师小跟班  Tags:go-micro   点击:(197)  评论:(0)  加入收藏
GoLand 2021.2 EAP 5 现已发布。用户可以从工具箱应用程序中获得 EAP 构建,也可以从官方网站手动下载。并且从此 EAP 开始,只有拥有有效的 JetBrains 帐户才能加入该计划。手...【详细内容】
2021-06-29  IT实战联盟  今日头条  Tags:GoLand   点击:(185)  评论:(0)  加入收藏
作者:HDT3213今天给大家带来的开源项目是 Godis:一个用 Go 语言实现的 Redis 服务器。支持: 5 种数据结构(string、list、hash、set、sortedset) 自动过期(TTL) 发布订阅、地理位...【详细内容】
2021-06-18  HelloGitHub  今日头条  Tags:Go   点击:(125)  评论:(0)  加入收藏
统一规范篇合理规划目录本篇主要描述了公司内部同事都必须遵守的一些开发规矩,如统一开发空间,既使用统一的开发工具来保证代码最后的格式的统一,开发中对文件和代码长度的控制...【详细内容】
2021-05-18  1024课堂    Tags:Go语言   点击:(232)  评论:(0)  加入收藏
闭包概述 闭包不是Go语言独有的概念,在很多编程语言中都有闭包 闭包就是解决局部变量不能被外部访问的一种解决方案 是把函数当作返回值的一种应用 代码演示总体思想:在函数...【详细内容】
2021-05-14  HelloGo  今日头条  Tags:Go语言   点击:(223)  评论:(0)  加入收藏
一时想不开,想了解一下Go语言,于是安装了并体验了一下。下载1. 进入golang.google.cn 点击Download Go 2.选择对应的操作系统,点击后开始下载。 安装1. windows下执行傻瓜式安...【详细内容】
2021-05-12  程序员fearlazy  fearlazy  Tags:Go语言   点击:(236)  评论:(0)  加入收藏
1.简介channel是Go语言的一大特性,基于channel有很多值得探讨的问题,如 channel为什么是并发安全的? 同步通道和异步通道有啥区别? 通道为何会阻塞协程? 使用通道导致阻塞的协程...【详细内容】
2021-05-10  程序员麻辣烫  今日头条  Tags:Go通道   点击:(274)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条