文档章节

基于T-IO的分布式推送系统与聊天系统

comsince
 comsince
发布于 07/19 15:08
字数 1558
阅读 422
收藏 0

概述

这个一个基础的消息通信架构,只在解决服务端与客户端消息通信,可应用于消息推送,即时通信以及由此衍生出来的消息通信业务。本项目基于其他开源项目的基础上,如t-io,wildfirechat, 希望通过合理的分布式架构,解决大规模并发链接的问题,从而适应互联网用户不断增长的需求,本项目将会采用微服务的开发与设计模式进行架构设计,尽量保持各个业务的单一性和高可用性。 这样的目的也是基于业务扩展的方式,方便以后能够在基于此通信架构基础上衍生其他相关业务,从而保持业务的独立性,增加项目的可维护性。

为了开源以及方便部署,将更换RPC框架为Dubbo,并且全部基于SpringBoot

<font color="#dd0000">扫码体验APK下载</font>

image

NOTE: 本apk基于android-chat构建替换为java协议栈开发

请选择其中任何一个帐号密码进行登录即可

帐号:13800000000, 13800000001, 13800000002
密码:556677

<font color="#dd0000">Android 运行效果图</font>

image

部署说明

NOTE: 如果只需要单机部署聊天服务,只需要部署push-connectpush-group服务

image

准备工作

为了脚本能够正常工作,请先在你的服务器建立如下目录/opt/boot,这个是脚本自动查找spring boot工程的目录,该目录下存放所有spring boot工程,具体工程目录结构如下:

依赖组件

  • redis
    push-connector集群模式下需要进行消息推送,利用redis的sub/pub进行消息的订阅与发布进而进行全局推送,集群模式现已经换成kafka发布订阅模式
  • zookeeper
    dubbo使用了zookeeper作为注册中心,因此需要安装zookeeper

启动停止服务

例如push-sub的启动方式,其他类同

# 启动服务
./push-sub start
# 停止服务
./push-sub stop

SpringBoot Dubbo服务启动

由于dubbo严格遵守服务依赖启动顺序,请安装顺序启动如下服务,本次版本加入了dubbo的metric功能,对dubbo的代码进行适当的改造,使用的这里的代码编译出来dubbo-2.7.2-SNAPSHOT,此功能大家可以等到dubbo-2.7.2正式发布

Dubbo admin metric

本项目引入dubbo admin监控项目,由于dubbo-2.7.2正式版没有发布所以对dubbo的相关项目做了改造以适应dubbo-metric数据统计,如果你在编译过程中遇到错误,可以到这里下载项目本地编译即可 image

相关项目

Dubbo项目参数说明

  • application.properties配置rediszookeeper地址

这里没用使用诸如nacos,apollo外部的配置中心,需要自己手动修改

push.redis.address=redis://172.16.46.213:6379

增加push-connector kafka集羣支持

## kafka broker
push.kafka.broker=172.16.177.107:9092
  • 运行mvn clean package -Dmaven.test.skip=true 打包springboot jar

以下服务如果用户量增加,都可以集群部署

  • 启动spring-boot-dubbo-push-subscribe订阅服务
/opt/boot/push-sub
├── jvm.ini
├── push-sub //可执行启动脚本
└── log
   └── push-sub.log //存放日志
└── lib
   └── spring-boot-dubbo-push-subscribe-1.0.0-SNAPSHOT.jar //可运行的jar
  • 启动spring-boot-dubbo-push-connector链接服务
/opt/boot/push-connector
├── jvm.ini
├── push-connector //可执行启动脚本
└── log
   └── push-connector.log //存放日志
└── lib
   └── spring-boot-dubbo-push-connector-1.0-SNAPSHOT.jar //可运行的jar

SpringBoot web项目

  • 启动spring-boot-web-push-api开放推送服务
/opt/boot/push-api
├── jvm.ini
├── push-api //可执行启动脚本
└── log
   └── push-api.log //存放日志
└── lib
   └── spring-boot-web-push-api-1.0.0-SNAPSHOT.jar //可运行的jar
  • 启动sping-boot-web-push-group群组服务
/opt/boot/push-group
├── jvm.ini
├── push-group //可执行启动脚本
└── log
   └── push-group.log //存放日志
└── lib
   └── sping-boot-web-push-group-1.0.0-SNAPSHOT.jar //可运行的jar

推送SDK

为了方便用户快速接入消息推送系统,特提供如下SDK,演示APK下载

image

基础架构

Push-connector

基本功能

  • 提供集群链接管理的能力
  • 提供消息群发的功能
  • 提供消息单发的功能
  • 客户端管理服务

Push-Router

基本功能

  • 只有在全网推送的模式下采用基于redis的发布订阅模型
  • 推送时能够根据token选择指定的push-connector直接推送
  • push-router与push-connector基于私有协议通信快速发送

Push-Sub

  • 对于订阅请求,消息体如果带有token则使用当前token,不再重新生成,也即是只要客户端不清除token,下次重建链接还是可以沿用先前的token
  • 对请求过来的token按照push-connector ip分组进行分组
  • 订阅服务需要生成链接的唯一id,目前采用的snakeflow算法,可能由于时钟回拨的问题,可能出现重复,可以考虑美团的leaf-snakeflow方案

Push-Cache[计划中]

基本功能

提供消息缓存服务

  • 消息缓存
  • 消息过期

Push-API

基本功能

提供推送Http接口服务,调用推送网关发送推送消息,此接口采用springboot开发web服务

Push-Group

此服务现已经改造成为聊天的基础服务,提供单聊,群聊的基本存储服务,提供RPC接口供push-connect调用

  • 单聊服务
  • 群组服务

Push-statics

  • 统计服务,负责对任务推送进行数据统计,方便以后进行到达率等重要指标分析,包括推送数,到达数,点击数,删除数(这些主要时针对通知栏推送)

部署

常见问题

部署connector要同时更新,防止出现redisson发布订阅数据解析问题

redisson 发布时最好使用统一个logger,不然会有序列化问题

参考资料

参考项目

© 著作权归作者所有

comsince
粉丝 1
博文 1
码字总数 1558
作品 0
珠海
私信 提问
socket.io搭建分布式web推送服务器

socket.io是目前较为流行的web实时推送框架,其基于nodejs语言开发,底层用engine.io实现。 借助nodejs语言异步的特性,其获得了不错的性能。但单个实例的socket.io依然承载能力有限,最多只...

骨头bone
2014/10/16
9.7K
18
GoPush —— 基于 Netty 的分布式推送消息服务

GoPush是开源的分布式推送消息服务,基于netty开发,依赖redis、Java8、SpringBoot和Zookeeper,不存在单点问题,拓展开可以做成客服、聊天、推送等诸多系统。...

王练
2017/10/30
103
0
分布式消息推送服务--GoPush

GoPush是开源的分布式推送消息服务. 基于netty开发 依赖redis 依赖Java8 依赖SpringBoot 依赖Zookeeper 不存在单点问题 拓展开可以做成客服、聊天、推送等诸多系统 技术架构图...

lee123lee
2017/10/28
4.6K
8
Netty干货分享:京东京麦的生产级TCP网关技术实践总结

1、引言 京东的京麦商家后台2014年构建网关,从HTTP网关发展到TCP网关。在2016年重构完成基于Netty4.x+Protobuf3.x实现对接PC和App上下行通信的高可用、高性能、高稳定的TCP长连接网关。 早期...

JackJiang2011
2017/12/01
0
0
异数OS-织梦师-PBFT(六) 走出区块链,加速破解PBFT

. 异数OS-织梦师-PBFT(六) 走出区块链,加速破解PBFT 拜占庭 本文来自异数OS社区 github: https://github.com/yds086/HereticOS 异数OS社区QQ群: 652455784 异数OS-织梦师(消息中间件 ...

心海岛主
01/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

一次看懂 Https 证书认证

TLS > 传输层安全性协定 TLS(Transport Layer Security),及其前身安全套接层 SSL(Secure Sockets Layer)是一种安全协议,目的是为网际网路通信,提供安全及数据完整性保障。 如图,TLS...

极客收藏夹
36分钟前
4
0
https证书买哪家好?有哪些供应商

在选购https证书前除了要了解类型外,还需要了解https证书供应商,毕竟不同的供应商,提供的产品质量与服务也是有差异的。今天小编就为大家讲讲https证书供应商方面的内容,希望各位会喜欢。...

安信证书
38分钟前
5
0
Zuul 配置

概述:zuul底层是基于servlet,是由一系列的filter链构成。 1、路由配置 a、单例serverId映射 zuul: routes: client-a: path: /client/** serviceId: client-a 意思是...

java框架开发者
56分钟前
3
0
zk中FinalRequestProcessor解析

是处理器最后一个环节 FinalRequestProcessor implements RequestProcessor 处理器链最后一个环节处理事务和非事务请求最后一个环节 构造器 public FinalRequestProcessor(ZooKeeperServer z...

writeademo
56分钟前
4
0
Axios 详解

首先祝广大程序猿们节日快乐! 一、axios简介 基于promise,用于浏览器和node.js的http客户端 二、特点 支持浏览器和 node.js 支持 promise 能拦截请求和响应 能转换请求和响应数据 能取消请求...

张兴华ZHero
57分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部