一、概述

使用netty开发分布式Im,提供分布netty集群解决方案。服务端通过负载均衡策略与服务集群建立连接,消息发送通过服务间集群的通信进行消息转发。

二、集群架构

三、项目地址

https://github.com/beardlessCat/im,烦请star

1.客户端

用户聊天客户端,客户端连接IM服务需要进行用户认证。用户认证成功之后,开始连接上线。

2.服务路由

服务路由负责将客户端的连接请求按照不同的负载均衡策略路由到不同的IM服务,建立长链接。负载均衡策略分为以下四种:

  • 一致性HASH负载均衡策略
  • 最少活跃数负载均衡策略
  • 随机调用负载均衡策略
  • 轮询调用负载均衡策略

3.IM服务集群

为了避免单节点故障,IM服务采用集群模式。集群内各个IM服务又互为对方的客户端,用于转发远程消息(消息接收客户端连接其他IM服务节点)。

4.ZK集群

ZK集群作为IM服务的注册中心,用户IM服务的注册与发现以及服务上线、下线的事件监听通知。通过node事件,控制IM服务之间连接的建立与断开。

5.消息队列

消息队列用户发送离线消息、聊天消息。

6.MongoDB集群

存储离线消息及聊天消息。

7.Redis集群

存储客户端的连接session信息(客户端与服务端连接的信息)

四、netty集群方案

首先需要明确一个问题,netty的channel是无法存储到redis里面的。netty的channel是一个连接,是和机器的硬件绑定的,无法序列化,计算存到redis里面,取出来也无法使用。

1.ZK作为注册中心实现

(1)channel无法存储的问题

channel是无法存储到redis里面的,但是客户端和服务端的连接信息(例如:127.0.0.1:8080的服务端是127.0.0.1:9090)是可以存储到redis里面的,因此可以通过redis存储连接信息。key为客户端标识,value为服务端地址信息,获取客户端的连接时,直接通过客户端信息即可获取其服务信息。

(2)服务端连接的问题

客户端连接服务端时,客户端如何知道当前服务端有哪些,需要要连接哪个?这个问题可以通过ZK解决。使用ZK作为注册中心,服务端上线后在ZK中创建node,连接服务端时,从ZK获取在线节点信息,根据负载均衡策略选择服务端连接。

(3)消息转发的问题

连接相同服务的客户端,可以直接通过获连接当前服取客户端信息进行消息的转发,那连接不同服务端消息如何转发?我们可以通过监听ZK中node的事件(node创建代表新的服务上线,node销毁代表服务下线),通过不同的事件方法,实现服务端之间的互相连接。

2.redis订阅与广播实现(可替换为消息队列)

redis支持消息订阅与发布机制机制(消息队列),可以使用该机制实现不同服务间的消息转发。在广播消息时,需要携带能唯一标识接收者身份的字段(例如clientId)。消息广播结束后,所有服务端会
收到该消息,服务端仅仅需要判断该消息接收者的是否是连接的自己作为服务端。若发现该接收者正是连接的自己,则直接将消息转发到该客户端即可。

五、核心功能

1.netty服务节点的注册与发现

2.netty服务节点的负载均衡策略

2.netty服务节点的消息转发

分布式IM及Netty服务集群解决方案相关推荐

  1. SkeyeVSS综合安防监控Onvif、RTSP、GB28181视频云无插件直播点播解决方案之子系统微服务集群解决方案

    SkeyeVSS综合安防监控Onvif.RTSP.GB28181视频云无插件直播点播解决方案之子系统微服务集群 我们通过SkeyeVSS系列文章<SkeyeVSS集群部署说明文档>可以了解 ...

  2. 分布式 WebSocket 集群解决方案

    作者 | weixin_34194702 来源 | blog.csdn.net/weixin_34194702/article/details/88701309 问题起因 最近做项目时遇到了需要多用户 ...

  3. tcp out of order解决_分布式集群解决方案 学习笔记

    回到目录: OrangeZh:拉勾教育:JAVA高薪训练营 学习技术篇​zhuanlan.zhihu.com 介绍 文章内容输出来源:拉勾教育 Java高薪训练营 分布式集群解决方案相关 什么是分布式 ...

  4. netty实现简单的rpc,支持服务集群

    netty实现简单的rpc,支持服务集群 前言 简介 环境准备 Netty 处理器链设计 消费者RPC代理工厂设计 netty rpc消费者核心设计 netty rpc生产者核心设计 服务注册.发现以 ...

  5. WebSocket 集群解决方案

    欢迎关注方志朋的博客,回复"666"获面试宝典 问题起因 最近做项目时遇到了需要多用户之间通信的问题,涉及到了WebSocket握手请求,以及集群中WebSocket Sessio ...

  6. WebSocket集群解决方案

    一.问题起因 最近做项目时遇到了需要多用户之间通信的问题,涉及到了WebSocket握手请求,以及集群中WebSocket Session共享的问题. 期间我经过了几天的研究,总结出了几个实现分布式W ...

  7. 私有云办公平台大规模集群/企业级集群/小型工作室集群解决方案:NextCloud集群部署方案--NextCloud集群架构设计

    原作者:NextCloud文档库 转载来源:https://docs.nextcloud.com/server/11/admin_manual/installation/deployment_reco ...

  8. Netty-SocketIO 集群解决方案

    Netty-SocketIO 集群解决方案 Netty-SocketIO作为一个Socket框架,使用非常方便,并且使用Netty开发性能也有保证. 但是,我在使用Netty-SocketIO框架时, ...

  9. 在滴滴云快速搭建自己的简易服务集群(入门版)

    引言 万物互联的时代,各行各业都或多或少的接入线上,作为开发人员,我们有了小而美的产品或服务方面的想法,就把它她做出来放到线上,让它发展壮大. 我以滴滴云为例,教你一步一步的搭建自己的服务器集群,包括 ...

最新文章

  1. android表格布局的使用方法,Android布局(RelativeLayout、TableLayout等)使用方法
  2. Java往事之《返回整数的长度》
  3. 校级选修课《软件开发实践》教学大纲(200807修订)
  4. BeanUtils自定义转换器
  5. PhiloGL学习(5)——神说要有光,便有了光
  6. IDEA 自动生成 serialVersionUID 的设置
  7. undefined: resolver.BuildOption
  8. androidManifest
  9. t3-财务通计算机名称,用友T3用友通财务软件操作方法
  10. 一文学懂经典算法系列之:直接选择排序(附讲解视频)
  11. Centos7安装iNode客户端
  12. 微信公众号图文消息悄悄调整,注定10月12号是个不眠夜
  13. Noob 靶场渗透记录
  14. kaggle-2美国人口普查年收入50K分类
  15. cmd命令行进行C++代码编译运行;实现进程调度和存储管理
  16. 《卸甲笔记》-多表查询之二
  17. 37岁老将魔笛告别世界杯,海信电视向传奇致敬
  18. 冈萨雷斯图像处理---非锐化掩蔽和高提升滤波
  19. 嵌套相对比较通俗的解释(网页百度内容,非原创)
  20. css淘宝下拉菜单,纯css打造最简洁下拉菜单-无js-非常实用

热门文章

  1. 使用forever运行nodejs应用
  2. python笔试110题(Interview questions)
  3. 【软件相关】Proteus仿真STM32记录
  4. Bartender使用心得
  5. 编码--了解编码,网站编码
  6. scribe配置文件详解
  7. 如何替换kubeadm,kubelet的版本
  8. 兆、字节、位之间的转换
  9. 心血管疾病数据探索分析
  10. 只用2个小时,我把公司的进销存流程全部搬到了线上!