集群服务器
2024-05-22 21:08:24 3 举报
111
作者其他创作
大纲/内容
业务函数:参数为网络层用来通信的连接,网络层解析完后的json,以及一个时间戳
该channel由服务器2订阅,服务器2从redis中获取订阅
登录业务发送到服务端
用户输入主线程
如果是注册回送的ack
连接回调
客户端
根据事件id从事件处理回调中找到函数并返回。
两个线程通过一个信号量进行通信,通知主线程子线程是否接收完毕,是否处理完了这个事件
服务器收到另一台服务器上的聊天业务,publish该channel
向服务器组织发送一条登录的json,然后等待子线程接收,接收完毕后进入聊天主页面
处理登录响应
注册响应子线程接收完毕
用户id:1
输入选择注册业务
当客户端断开连接时,执行客户端异常退出函数,从map中找到该连接对应的用户id,从map表中删除
输出注册是否成功
用户id:6
各个数据操作类对象
根据命令格式输入命令,读出命令类型,有一个map保存了命令以及对应的命令处理函数,调用该命令处理函数
数据操作对象基本都有一个类,类中包含这个数据对应的各种操作
如果是登录回送的ack
nginx负载均衡,接收客户端连接,并分发到具体的服务端
登录成功记录当前登录的用户id和name,记录好友以及群组信息,展示用户消息,离线消息等
调用一次构造函数,返回对象
单例模式创建
中间键
注销业务注销后,服务器向redis取消订阅该channel。同样客户端异常退出函数也是取消订阅channel
输入选择退出
所有的业务函数都是从json中读出内容,然后通过数据操作对象操作数据库内容,读出或添加内容,并组织一个response json 序列化后通过通信连接发送回去
redis操作对象
服务端
聊天业务则是找到对方id用户是否在线,如果在线则调用redis的publish函数,向该id发布消息。同样群组聊天业务则是找到群中所有在线用户publish发布消息
登录响应子线程接收完毕
聊天业务发送到登录的服务端
第二步,调用获取的函数
各种操作底层实际就是对数据库进行增删改查,因此底层还有一个数据库操作类,封装了对数据库的基本操作函数
从用户与连接的map中查询该用户的连接是否还在线,如果还在,则先这个连接发送参数中msg消息
第一步,获取函数
用户id:5
登录业务处理,向redis订阅该channel
如果接收的是消息类型,则直接打印json中的消息
发送一条注册消息,然后等待接收子线程处理完毕
chatserver类,实际上是直接个性化应用了muduo的server类,包括注册两个回调函数,以及muduo服务器的其他参数设置。服务器启动函数
用户id:3
其中登录业务登录成功后,该服务器向redis订阅channel(id)
每一个命令处理函数参数都是一个同学新的文件套接字以及剩余的字符串,解析剩余字符串,组织一个json,通过文件套接字发送回服务端
聊天业务
从redis中获取订阅的消息函数,函数参数为用户id,和消息msg。这是上报消息的函数,即有消息发到了这个服务器下登录的用户中
存储消息id和业务处理方法的map
处理注册响应
只有一个main函数:首先连接集群服务端,通过集群的ip和port,建立套接字通信
启动一个接收子线程
服务器2
服务器1
存储当前服务器在线用户id和其通信套接字连接的map
redis
用户id:2
分配到具体的服务器
chatservice类:聊天服务器业务类
从buffer接收的缓冲区中读出内容,然后反序列化,根据json中的msgid从chatservice获取该事件的处理函数,然后调用该处理函数
各服务器订阅的channel
main函数中读取输入的IP和端口,初始化eventloop和地址,进而初始化一个chatserver服务器,启动服务器
数据成员
输入选择,登录业务
获取处理器函数
用户id:4
连接服务器
构造函数:将所有业务的标识id和绑定函数插入到事件处理回调map中。redis操作对象连接redis服务器,同时绑定redis上报消息的回调函数。
互斥锁
0 条评论
下一页