并发是什么?企业在进行产品开发过程中为什么需要考虑这个问题?想象一下天猫的双11和京东的618活动,一秒的点击量就有几十万甚至上百万,这么多请求一下子涌入到服务器,服务器需要对这么多的请求逐个进行消化掉,假如服务器一秒的处理能力就几万,那么剩下的不能及时得到处理的这些请求作何处理?总不能让用户界面一直等着,因此消息队列应运而生,所有的请求都统一放入消息队列,工作线程从消息队列不断的消费,消息队列相当于一个缓冲区,可达到解藕、异步和削峰的目的。
Kafka、ActiveMQ、RabbitMQ和RockerMQ都是消息队列的典型,每一种都有其自身的优势和劣势。本文我用自己编写的Buffer类模拟消息队列,如果是企业级需要上线的应用,一般都是基于业界已有的MQ框架上开发。
1.UML静态类图:
2.UML动态时序图:
1.如图,开了三个Client,运行结果正确:
2.Server端通过Log4cpp把日志写到文件中:
https://github.com/icoty/cs_threadpool_epoll_mq
.
├── client // 客户端Demo
│?? ├── Client.cc
│?? ├── Client.exe
│?? ├── client.sh // 进入该目录下启动Client Demo: sh client.sh
│?? ├── Log4func.cc // 引入日志模块重新疯转
│?? ├── Log4func.h
│?? └── Makefile // 编译方式:make
├── conf
│?? └── my.conf // IP,Port配置文件, 从这里进行修改
├── include // 头文件
│?? ├── Configuration.hpp // 配置文件,单例类,my.conf的内存化
│?? ├── FileName.hpp // 全局定义,Configuration会用到
│?? ├── log // 日志模块头文件
│?? │?? └── Log4func.hpp
│?? ├── net // 网络框架模块头文件
│?? │?? ├── EpollPoller.hpp
│?? │?? ├── InetAddress.hpp
│?? │?? ├── Socket.hpp
│?? │?? ├── SockIO.hpp
│?? │?? ├── TcpConnection.hpp
│?? │?? └── TcpServer.hpp
│?? ├── String2Upper.hpp // 工作线程转换成大写实际走的这里面的接口
│?? ├── String2UpperServer.hpp // Server端的整个工厂
│?? └── threadpool // 线程池、锁、条件变量和消息队列的封装
│?? ├── Buffer.hpp
│?? ├── Condition.hpp
│?? ├── MutexLock.hpp
│?? ├── Noncopyable.hpp
│?? ├── Pthread.hpp
│?? ├── Task.hpp
│?? └── Threadpool.hpp
├── log // Server端的日志通过Log4cpp记录到这个文件中
│?? └── log4test.log
├── Makefile // 编译方式:make
├── README.md
├── server // server端Demo
│?? ├── server.exe
│?? └── server.sh // 进入该目录下启动Server Demo:sh server.sh
└── src // 源文件
├── Configuration.cpp
├── log
│?? └── Log4func.cpp
├── main.cpp
├── net
│?? ├── EpollPoller.cpp
│?? ├── InetAddress.cpp
│?? ├── Socket.cpp
│?? ├── SockIO.cpp
│?? ├── TcpConnection.cpp
│?? └── TcpServer.cpp
├── String2Upper.cpp
├── String2UpperServer.cpp
└── threadpool
├── Buffer.cpp
├── Condition.cpp
├── MutexLock.cpp // MutexLockGuard封装
├── Pthread.cpp
└── Threadpool.cpp
[1] UNIX环境高级编程第3版
[2] cpp reference
[3] UML时序图
[4] Log4cpp官网下载
[5] Log4cpp安装
基于线程池、消息队列和epoll模型实现Client-Server并发架构
原文:https://www.cnblogs.com/icoty23/p/10989445.html