- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
推送服务实现方案
实现推送服务所需的功能分成了两部分:消息系统、推送任务管理系统。主体是消息系
统,功能上比较通用,不包含业务逻辑;不只可以用来实现推送功能,也可以在其它业务中
使用。
一、消息系统
消息系统是基于TCP长连接的,用户登录服务器就可以进行消息交互。消息的交互
有两种方式:
1.一对一的消息发送:发送者向指定的接收者发送消息,由服务器进行转发;为了优
化性能,消息服务器提供了向一组clientid发消息的功能,也就是批量发送;与一
条一条发功能相同但效率更高;
2.基于订阅与发布的一对多的消息发送:发送者向一个发布消息,服务器将该消
息推送给订阅该的接受者。发布的消息分成了两种:的和有期的;
有期的消息会在该上保留指定的时间,只要在期内,后续订阅的客户
端也可以收到该消息;而的消息只有发布时的订阅者可以收到,后续的订阅
者无法收到;
对于收到的每条消息,接收者除了知道消息内容外,还知道发送者的ID,其是否为master,
以及相关的
实现上的考虑主要有:
1.消息体对服务器是透明的,具体格式和内容由客户端确定
2.消息的发送不是完全可靠的,无论消息发送成功或失败,发送者都不会得到任何反
馈;整体上类似于UDP的单播和组播
用户登录时需指定的信息有:
clientid:用户ID(字符串)
master:是否为master(bool值)
app:应用名称(字符串)
appkey:登录(字符串;同一应用的不同用户共享,区分masterkey和一般的key)
clientid由使用者自己确定,app和clientid合起来确定一个登陆连接;登陆时如果clientid
和该app下的现有连接,就会将现有的旧连接关闭;
客户登陆时可以指定希望的权限:master或normal;有些只有拥有master权限的
用户可以订阅或者在其上发布消息;
消息服务器可以单机部署也可以以集群的方式部署,在集群的部署方式中,所用到的服
务器分为前端的消息服务器和后端的管理服务器;
管理服务器是通过前端消息服务器的客户端与消息服务器进行交互的,每个消息服务器
上都有一些以/sysctrl/开头的,管理服务器会订阅这些,获取到相关的消息,进行
处理。管理服务器登录时使用的app是sysctrl。
所用到的sysctrl有:
/sysctrl/client-status
/sysctrl/publish
/sysctrl/send
/sysctrl/batch-send
/sysctrl/topic-control
/sysctrl/topic-status
登陆信息管理:
登录信息会被保存在session-db中(线上部署可以使用运维部门现有的redis集群),可
以根据app、clientid获取其所登录的消息服务器的地址
login-server负责对登录信息进行。每个消息服务器上有一个用于发布用户登录状
态的:/sysctrl/client-status;当消息服务器上有用户登录、、心跳时,会向该上
发布消息;login-server订阅了该,就可以获取到用户的状态信息,并根据这些信息对登
录信息数据库(redis)进行更新;
一对一的消息转发:
如果接受者和发送者在同一台消息服务器上,就可以直接完成转发;而如果不在同一台
服务器上,就需要后端服务器message-router进行转发;方式是消息服务器将转发请求打包
好发布到/sysctrl/send上,message-router订阅了该,对于收到的每条消息,进行解
包,获取接收者的app、clientid以及消息体等;然后通过session-db获取接受者所在的消息
服务器,并在该服务器的/sysctrl/send
文档评论(0)