国家建设部官方网站投诉,wordpress改变访问目录结构,巩义网站建设案例,永久免费影视建站程序梳理一下最近接触到的几个知识点#xff1a;
1#xff1a;突然问到端口复用 #xff08;SO_REUSEADDR#xff09;
端口复用一般用在服务端重启时#xff0c;套接字处于time_wait状态时#xff0c;无法绑定该端口#xff0c;导致无法启动问题。
设置端口复用#xff…梳理一下最近接触到的几个知识点
1突然问到端口复用 SO_REUSEADDR
端口复用一般用在服务端重启时套接字处于time_wait状态时无法绑定该端口导致无法启动问题。
设置端口复用可以多个进程绑定同一个端口注意考虑数据接收业务处理。
端口复用也可以用在udp。
2工作中涉及到使用udp传输大报文的场景udp数据包中有最大限制两个字节存长度 2^16 - 1 65535字节包括头部。
1使用多进程方案同时监听同一个端口需要设置端口可重用。 但是在处理时就得注意接收。
我的项目中用的是udp多进程监听不同的端口然后进行汇总业务相关接收同一个业务选优。
2与应用场景有关客户端硬件设备不支持修改协议以及进行udp拆包所以只能传输大报文。
首先需要测试网络链路无问题可以传输udp大包实际上借助底层ip分片防止中间有节点限制包大小。
传输大包时需要对udp的接收缓冲区进行扩大同时需要考虑接收时缓冲区大小设置。
recvfrom接收到数据后完整性初步校验后交给下一个处理线程包的形式或者数据结构/类。
这里业务场景相关协议比较复杂协议长度一般是240*64的包大小一包这么大
不同的协议用不同的头部可以进行区分比如这里区分全帧和挑路数据之后就是解析
需要计算带宽这里的带宽大概是 每秒4帧 每帧240 *64 总共 61440 字节
61440byte 60kb 0.0586Mb
61440*8 bit 491520bit 0.491Mbps 每秒传输的比特位 3问到丢包率
实现的过程中会统计接收到的包的信息并未统计过丢包率。未进行测试
从业务运行场景进行分析在网络状态良好的情况下甚至可能不丢包与业务相关极端场景下可能直接收不到包。
3问到一个场景多个服务器进程同时接收一个客户端的场景处理相同的业务
是我理解错了有前置条件先入为主以为听说多进程同时接收一个业务的处理这种冗余吧不会这样设计
1从架构角度考虑使用负载均衡的方式使客户端连接同一个服务器进行处理。
2服务器互相交互对处理业务进行存储处理如数据库。
4思考如何实现一个服务器
网络入口业务处理。
1 网络入口如果并发并不超级大以及业务不复杂的话一个epoll就够用用于接收。nginx是多个进程负责接入然后本进程处理业务与nginx处理的业务场景有关
2如果并发比较大业务不复杂如niginx的业务场景可以采用类似nginx的场景吧。
》业务不复杂的话epoll作为入口接收后管理fd把fd和接收数据放入队列下一个线程取队列进行处理处理完找fd回复。
》tcp需要业务处理时 可以用session对象进行管理管理接收数据拆包等处理。
3如果并发还可以要维持长连接进行交互以及涉及复杂业务操作数据库等。
关于入口
》网络入口可以是一个进程的epoll其他也行负责数据的接入。 设置fd非阻塞 --负责与session管理交互 智能指针管理session
》以fd和session的对应关系处理长连接。stl管理或者对象管理 连接在epoll中管理 可以用回调函数的方式 适配连接到业务 处理心跳
》session读写数据构造task包含回调 用线程池的方案处理对应业务回调函数返回结构。 1管理连接的回调在epoll中处理。 2管理协议的回调传给task在线程池中返回 传递fd对应关系进行发送
》线程池中专门的线程1负责消费线程除了执行线程外 线程1管理消费task的调用函数和task进行绑定确定调用函数 线程2 负责执行task进行消费 线程3 负责线程的释放
》通过回调函数可以设置自定义执行业务对结果进行返回 数据的发送 同样是调用上面的网络入口id和session的关联进行回复。
关于业务
上面的回调中处理业务根据不同的协议进行处理。 比如心跳比如登录操作数据库等。
使用连接池可以优化数据库的操作。 已有连接池DBpool 自己实现相关数据库操作接口 连接池的个数小型10~20个这里用10个
线程池的线程个数可以设置限制根据空闲线程数按需进行扩容。 最大线程数当前线程数
》一般定义为核心的2倍io密集型可以更多。 根据业务如果短小快业务也可以适当更多线程。
4并发超级大可以考虑负载均衡吧。
并发超级大业务不复杂可以自己设计如epoll支持百万并发
5服务器设计时为啥设计成这种分模块
可维护性单一职责减少复杂性可扩展性便于合作重用性便于改进部署。