189 8069 5689

go语言推送服务 golang消息推送系统

基于go的websocket消息推送的集群实现

目前websocket技术已经很成熟,选型Go语言,当然是为了节省成本以及它强大的高并发性能。我使用的是第三方开源的websocket库即gorilla/websocket。

成都创新互联公司不只是一家网站建设的网络公司;我们对营销、技术、服务都有自己独特见解,公司采取“创意+综合+营销”一体化的方式为您提供更专业的服务!我们经历的每一步也许不一定是最完美的,但每一步都有值得深思的意义。我们珍视每一份信任,关注我们的网站制作、成都网站设计质量和服务品质,在得到用户满意的同时,也能得到同行业的专业认可,能够为行业创新发展助力。未来将继续专注于技术创新,服务升级,满足企业一站式全网整合营销推广需求,让再小的品牌网站制作也能产生价值!

由于我们线上推送的量不小,推送后端需要部署多节点保持高可用,所以需要自己做集群,具体架构方案如图:

Auth Service:鉴权服务,根据Token验证用户权限。

Collect Service:消息采集服务,负责收集业务系统消息,存入MongoDB后,发送给消息分发服务。

Dispatch Service:消息分发服务,根据路由规则分发至对应消息推送服务节点上。

Push Service:消息推送服务,通过websocket将消息推送给用户。

集群推送的关键点在于,web端与服务端建立长连接之后,具体跟哪个推送节点保持长连接的,如果我们能够找到对应的连接节点,那么我们就可以将消息推送出去。下面讲解一下集群的大致流程:

1. web端用户登录之后,带上token与后端推送服务(Push Service)保持长连接。

2. 推送服务收到连接请求之后,携带token去鉴权服务(Auth Service)验证此token权限,并返回用户ID。

3. 把返回的用户ID与长连接存入本地缓存,保持用户ID与长连接绑定关系。

4. 再将用户ID与本推送节点IP存入redis,建立用户(即长连接)与节点绑定关系,并设置失效时间。

5. 采集服务(Collect Service)收集业务消息,首先存入mongodb,然后将消息透传给分发服务(Dispatch Service)。

6. 分发服务收到消息之后,根据消息体中的用户ID,从redis中获取对应的推送服务节点IP,然后转发给对应的推送节点。

7. 推送服务节点收到消息之后,根据用户ID,从本地缓存中取出对应的长连接,将消息推送给客户端。

其他注意事项:

go语言grpc的stream 使用

之前我们讲了 grpc 怎么简单的使用 ,这次讲讲 grpc 中的 stream,srteam 顾名思义 就是 一种 流,可以源源不断的 推送 数据,很适合 传输一些大数据,或者 服务端 和 客户端 长时间 数据交互,比如 客户端 可以向 服务端 订阅 一个数据,服务端 就 可以利用 stream ,源源不断地 推送数据。

其实这个流 已经 基本退化成 tcp了,grpc 底层为我们 分包了,所以真的很方便。

我们在 protobuf 里面 定义 要提供的服务,如果 你想把哪个数据 源源不断的 推送 就在前面加个stream 就好了,定义好记得编译。

知识点:

client 调用 流的函数, 就会 返回一个 流对象,只要 不断地 对它进行读取或者写入,对应方就能收到。

grpc 的 stream 和 go的协程 配合 简直完美。通过流 我们 可以更加 灵活的 实现自己的业务。如 订阅,大数据传输等。

APNS推送Golang SDK使用Proxy代理

苹果的消息推送是通过请求域名: 实现的,该域名解析结果为美国,这引发了两个问题:

1、接口请求时间长,性能低,而且容易请求超时报错

2、高峰期推送请求错误率升高

总体思路:增加一个美国代理服务器,通过代理服务器请求苹果消息推送服务

1、原来流程

2、现在流程

3、具体方案实施选择

选择一:proxy服务器,部署一个正向代理服务,提供push消息的正向代理,消息通过代理服务器送达苹果服务端

选择二:proxy服务器,独立实现、部署一个 标准的apns服务,负责 ios消息推送。将需要走美国节点的请求转发到该proxy节点

具体情况、具体分析,应思考的点:

问题一、苹果官方提供的SDK中,不支持设置代理服务器。官方SDK不适合更改,对以后系统更新不利

问题二、只有苹果的push服务需要代理,其他例如华为、小米、vivo不应走海外代理

问题三、代理安全性

问题四、代理方案下,有重试逻辑。 如何准确定义和判断失败, 可能会引起消息重复推送

问题五、实现简单、有效,正向代理方式:只需实现一个实例化对象方法,其他利用原始sdk即可。独立apns服务方式:需要实现一个apns服务,国内、国外均需服务部署,需要增加独立的开发和运营成本,另外还得改造调用服务,实现请求调度,优点服务独立、单一,具备一个单独微服务条件

github.com/sideshow/apns2

方法一: 修改SDK文件

第一步:设置环境变量

第二步:修改apns2.NewClient方法

方法二: 从新定义一个NewClient方法


本文标题:go语言推送服务 golang消息推送系统
本文地址:http://cdxtjz.com/article/hijgoi.html

其他资讯