[集群聊天服务器]----(一)项目简介

news2024/11/15 8:38:03

在最近的学习中,实现了基于muduo网络库的集群聊天服务器,在此做一个剖析以及相关内容的梳理介绍,希望可以帮助到大家。
这一篇,先来简单介绍一下这个项目。

源码地址

Cluster_Chat_System-项目

项目技术特点

  • 使用C++开发并基于 muduo 网络库开发网络核心模块,实现高效通信
  • 封装 MySQL 接口,将重要的用户数据储存到磁盘中,实现数据持久化
  • 使用第三方 JSON 库实现通信数据的序列化和反序列化
  • 使用 Nginx 的 TCP 负载均衡功能,将客户端请求以轮询的方式派发到多个服务器上,提高了并发处理能力
  • 基于发布-订阅的服务器中间件redis消息队列,解决客户端之间跨服务器通信难题
  • 基于 CMake 构建项目

项目需求

  1. 客户端新用户注册,用户登录
  2. 添加好友和添加群组
  3. 好友聊天以及群组聊天
  4. 存储以及显示离线消息
  5. 利用nginx配置tcp负载均衡,提高并发量
  6. 集群聊天系统支持客户端跨服务器通信

项目开发环境

  1. Linux环境 CentOS7
  2. 安装json第三方开发库 Linux下安装JSON的步骤以及JSON是什么
  3. 安装boost以及muduo网络库开发环境,注意,gcc/g++编译器必须保证在5.4 - 7.8版本之间,并且因为muduo是libmuduo_xx.a静态链接库,链接阶段直接合并到可执行文件中的,如果原先安装编译过muduo库,升级完gcc,需要把muduo重新源码编译安装一下,建议在安装之前就升级g++版本 有关安装步骤请看Linux平台下muduo网络库源码编译安装与测试,包含boost库的安装与测试!!!!
  4. 安装redis环境 Linux下安装redis并配置开机自启保姆级教程-----附带每一步截图
  5. 安装mysql数据库 Linux安装MySQL(超详细)
  6. 安装nginx Linux系统下安装配置nginx—附带每一步截图
  7. 安装CMake环境Linux下安装CMake的方法

开发环境

vscode在linux环境下直接开发 VSCode - 使用VSCode远程连接到Linux并实现免密码登录

MySQL数据库表格设计

在这里插入图片描述
关于表的配置,以user为例Mysql基础—创建数据库以及表,附带截图。

业务模块简介

注册模块

从网络模块接收数据,根据 msgid 定位到注册模块。从传递过来的 json 对象中获取用户 ID 和用户密码。并以此生成 User 对象,调用 model 层方法将新生成的 User 插入到数据库中。

登录模块

从 json 对象中获取用户ID和密码,并在数据库中查询对比获取用户信息是否匹配。如果用户已经登录过或者账号密码错误,返回错误信息。登录成功后更改用户表中用户状态,并显示该用户的好友列表群组列表以及收到的离线消息。

客户端异常退出模块

客户端异常退出了,从服务端记录用户连接的表中找到该用户,如果它断连了就从此表中删除,并设置其状态为 offline。

服务端异常退出模块

服务端异常退出(捕捉到CTRL + C ),将所有在线的客户的状态都设置为 offline。使用了 Linux 的信号处理函数,向信号注册回调函数,然后在函数内将所有用户置为下线状态。

一对一聊天模块

通过传递的 json 查找对话用户 ID:
用户处于同一台服务器并且处于登录状态:直接向该用户发送信息
用户不在同一台服务器,在redis查找,处于登录状态:向该用户发送信息
用户处于离线状态:存储离线消息

添加好友模块

从 json 对象中获取添加登录用户 ID 和其想添加的好友的 ID,调用 model 层代码在 friend 表中插入好友信息。

群组模块

创建群组需要描述群组名称,群组的描述,然后调用 model 层方法在数据库中记录新群组信息。加入群组的用户需要给出用户 ID 和想要加入群组的 ID,并显示显示该用户是群组的普通成员还是创建者。

群组聊天

给出群组 ID 和聊天信息,
群内成员用户处于同一台服务器并且处于登录状态:直接向该用户发送信息
群内成员用户不在同一台服务器,在redis查找,处于登录状态:向该用户发送信息
群内成员用户处于离线状态:存储离线消息

Nginx负载均衡模块

假设一台机器支持两万的并发量,现在我们需要保证八万的并发量。但是单台机器的性能是有限的,即使我们升级服务器的配置,(提高 CPU 执行频率,加大内存等提高机器的物理性能),也无法达到并发量。所以需要增加服务器的数量,将用户请求分发到不同的服务器上分担压力,这就是负载均衡。就需要有一个第三方组件充当负载均衡器,由它负责将不同的请求分发到不同的服务器上。而本项目,我们选择 Nginx 的负载均衡功能。
相关配置,会在Nginx模块中给出。

负载均衡模块需要实现三个功能
  1. 把client的请求按照轮询算法分发到服务器ChatServer上
  2. 能够和ChantServer保持心跳机制,及时检测ChatServer故障,确保不会分发到故障机上
  3. 及时发现新添加的ChatServer设备,方便扩展服务器数量,不需要停止服务器

redis发布-订阅功能解决跨服务器通信问题

使用集群服务器,有多个服务器维护自己的用户列表。ChatServer1与ChatServer2的用户聊天,ChatServer1在自己服务器的用户表中找不到,但是可能用户在线,所以我们需要保证跨服务器间的通信!但是如果让后端的服务器之间互相连接,让各个ChatServer服务器互相之间直接建立TCP连接进行通信,相当于在服务器网络之间进行广播。ChatServer维护了一个连接的用户表,每次向别的用户发消息都会从用户表中查看对端用户是否在线。然后再判断是直接发送,还是转为离线消息。这样的设计使得各个服务器之间耦合度太高,不利于系统扩展,并且会占用系统大量的socket资源,各服务器之间的带宽压力很大,不能够节省资源给更多的客户端提供服务,并且存在一个服务器瘫痪其余都崩溃的情况,不采用。
所以引入中间件消息队列,解耦各个服务器,使整个系统松耦合,提高服务器的响应能力,节省服务器的带宽资源,在集群分布式环境中,经常使用的中间件消息队列有ActiveMQ、RabbitMQ、Kafka等,都是应用场景广泛并且性能很好的消息队列,供集群服务器之间,分布式服务之间进行消息通信。但是本项目业务类型并不是非常复杂,对并发请求量也没有太高的要求,因此我们的中间件消息队列选型的是-基于发布-订阅模式的redis。

好了~关于Cluster_Chat_System项目简介就到此结束了,下一篇我们将正式开始剖析代码实现具体功能!感兴趣的伙伴们可以按照步骤按照好环境,一步一步跟着来哦 ~ 写在最后,小白一枚,希望看到错误的各位大佬批评指正 ~ ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1695964.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ASP+ACCESS公司门户网站建设

【摘 要】随着计算机科学的发展,数据库技术在Internet中的应用越来越广泛,为广大网络用户提供了更加周到和人性化的服务。本文讲解了一个公司的网站的建设,它基于数据关联规则的公司个性化页面及动态数据生成案例,在网页方面&…

Linux--线程的认识(一)

线程的概念 线程(Thread)是操作系统中进行程序执行的最小单位,也是程序调度和分派的基本单位。它通常被包含在进程之中,是进程中的实际运作单位。一个线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线…

Django与前端框架协作开发实战:高效构建现代Web应用

title: Django与前端框架协作开发实战:高效构建现代Web应用 date: 2024/5/22 20:07:47 updated: 2024/5/22 20:07:47 categories: 后端开发 tags: DjangoREST前端框架SSR渲染SPA路由SEO优化组件库集成状态管理 第1章:简介 1.1 Django简介 Django是一…

hive3从入门到精通(二)

第15章:Hive SQL Join连接操作 15-1.Hive Join语法规则 join分类 在Hive中,当下版本3.1.2总共支持6种join语法。分别是: inner join(内连接)left join(左连接)right join(右连接)…

04.爬虫---Session和Cookie

04.Session和Cookie 1.Session2.Cookie3.详细对比4.Cookie属性结构5.一些误区 Session和Cookie是Web开发中用于用户状态管理的两种常见技术。理解它们的区别对于开发安全的Web应用至关重要。 1.Session Session代表服务器与客户端的一次会话过程。服务器端存储了Session对象&…

智能合作:多AI协同助力传统工作流

背景介绍 红杉资本2024 AI AGENT大会上吴恩达再次介绍了AI四大设计模式即: 反思(Reflection);工具使用(Tool use);规划(Planning);多智能体协作(Multi-agent collaboration)&#…

spring模块(三)Spring AOP(2)使用

一、demo 1、spring项目 &#xff08;1&#xff09;pom <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.3.13.RELEASE</version></dependency>&l…

数据分析工程师——什么是数据分析?

数据分析工程师 对于目前就业市场上的技术岗位,除了开发、测试、运维等常见职位之外,数据类岗位也越来越成为热门的求职方向。本文将重点介绍 数据分析 这一新兴岗位。 看到「数据分析」这几个字,也许大家的第一印象一样,觉得要做的工作似乎并不难,有大量数据后根据业务…

Redis分布式存储方案

一、Redis分布式存储方案 1、哈希取余分区 ①、原理 哈希计算&#xff1a;首先&#xff0c;对每个键&#xff08;key&#xff09;进行哈希计算&#xff0c;得到一个整数哈希值&#xff08;hash value&#xff09;。取余操作&#xff1a;将这个哈希值对服务器数量进行取余操作…

AI播客下载:The Logan Bartlett Show Podcast(AI创业投资主题)

Logan Bartlett Show Podcast是一个播客&#xff0c;主持人Logan Bartlett与科技界的领导者以及投资者进行对话&#xff0c;讨论他们在运营或投资企业中学到的经验教训&#xff0c;主要集中在科技创投领域。 Logan Bartlett 是 Redpoint Ventures 的投资人&#xff0c;并且在该…

AI视频智能分析引领智慧园区升级:EasyCVR智慧园区视频管理方案

一、系统概述与需求 随着信息技术的不断发展&#xff0c;智慧园区作为城市现代化的重要组成部分&#xff0c;对安全监控、智能化管理提出了更高的要求。智慧园区视频智能管理系统作为实现园区智能化管理的重要手段&#xff0c;通过对园区内各关键节点的视频监控和智能分析&…

八、函数和数组

8.1 函数 函数几乎是学习所有的程序设计语言时都必须过的一关。对于学习过其他的程序语言的用户来说&#xff0c;函数可能并不陌生。但是Shell中的函数与其他的程序设计语言的函数有许多不同之处。 8.1.1什么是函数 通俗地讲&#xff0c;所谓函数就是将一组功能相对独立的代码…

springboot+mysql在线考试系统-计算机毕业设计源码82584

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对在线考试等问题&#xff0c;对如何通过计算…

Keli5烧写STM32程序时出现ST-LINK USB communication error错误(USB 通信错误)

1错误原图 2错误原因 前提驱动安装正确 原因1 usb接触不良&#xff08;极少出现&#xff09; 解决方法 更换USB线 还不行连下载器一起更换 原因2&#xff08;出现概率比较大&#xff09; 下载器的固件出现问题或下载器固件版本与Keli5的版本不匹配 解决方法 在Keli5的…

部署CNI网络组件+k8s多master集群部署+负载均衡

一、环境部署 主机服务 192.168.91.5 K8S集群master01192.168.91.8 K8S集群master02192.168.91.6K8S集群node01192.168.91.7K8S集群node02192.168.91.9 负载均衡nginxkeepalive01&#xff08;master&#xff09;192.168.91.10 负载均衡nginxkeepalive02&#xff08;backup&am…

「51媒体」如何与媒体建立良好关系?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 与媒体建立良好关系对于企业或个人来说都是一项重要的公关活动。 了解媒体&#xff1a;研究媒体和记者的兴趣&#xff0c;提供相关且有价值的信息。 建立联系&#xff1a;通过专业的方式…

哈希双指针

文章目录 一、哈希1.1两数之和1.2字母异位词分组1.3最长子序列 二、双指针2.1[移动零](https://leetcode.cn/problems/move-zeroes/description/?envTypestudy-plan-v2&envIdtop-100-liked)2.2[盛最多水的容器](https://leetcode.cn/problems/container-with-most-water/d…

SVM原问题与对偶问题

目的&#xff1a;求出我们的f(X)&#xff0c;它代表着我们X映射到多维的情况&#xff0c;能够帮我们在多维中招到超平面进行分类。 1.优化问题&#xff1a; 1.1推荐好书&#xff1a; 1.2 优化理论中的原问题&#xff1a; 原问题和限制条件如下&#xff1a; 这是一个泛化性…

006、API_单线程

Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库 服务&#xff0c;本节首先通过多个客户端命令调用的例子说明Redis单线程命令处理 机制&#xff0c;接着分析Redis单线程模型为什么性能如此之高&#xff0c;最终给出为什么理 解单线程模型是使用和运维Redis的…

【Java EE】网络协议——HTTP协议

目录 1.HTTP 1.1HTTP是什么 1.2理解“应用层协议” 1.3理解HTTP协议的工作过程 2.HTTP协议格式 2.1抓包工具的使用 2.2抓包工具的原理 2.3抓包结果 3.协议格式总结 1.HTTP 1.1HTTP是什么 HTTP&#xff08;全称为“超文本传输协议”&#xff09;是一种应用非常广泛的应…