我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Mycat 网络通信模块源码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Mycat 网络通信模块源码

Mycat 用户手册:
系统I/O 可分为阻塞型, 非阻塞同步型以及非阻塞异步型.
阻塞型I/O意味着控制权直到调用操作结束了才会回到调用者手里. 结果调用者被阻塞了, 这段时间了做不了任何其它事情. 更郁闷的是,在等待IO结果的时间里,调用者所在线程此时无法腾出手来去响应其它的请求,这真是太浪费资源了。拿read()操作来说吧, 调用此函数的代码会一直僵在此处直至它所读的socket缓存中有数据到来.
相比之下,非阻塞同步是会立即返回控制权给调用者的。调用者不需要等等,它从调用的函数获取两种结果:要么此次调用成功进行了;要么系统返回错误标识告诉调用者当前资源不可用,你再等等或者再试度看吧。比如read()操作, 如果当前socket无数据可读,则立即返回EWOULBLOCK/EAGAIN,告诉调用read()者“数据还没准备好,你稍后再试”。
在非阻塞异步调用中,稍有不同。调用函数在立即返回时,还告诉调用者,这次请求已经开始了。系统会使用另外的资源或者线程来完成这次调用操作,并在完成的时候知会调用者(比如通过回调函数)。拿Windows的ReadFile()或者POSIX的aio_read()来说,调用它之后,函数立即返回,操作系统在后台同时开始读操作。
在以上三种IO形式中,理论上,非阻塞异步是性能最高、伸缩性最好的。
同步和异步是相对于应用和内核的交互方式而言的,同步需要主动去询问,而异步的时候内核在IO事件发生的时候通知应用程序,而阻塞和非阻塞仅仅是系统在调用系统调用的时候函数的实现方式而已。
对于JAVA的API来说:

  • java.net.Socket就是典型的阻塞型IO
  • java NIO非阻塞同步
  • java AIO非阻塞异步
    MyCAT起源于Cobar,Cobar前端为NIO后端为BIO,后端就是通过java.net.Socket进行读写,所以Cobar后端每次进行读写都会造成线程阻塞,后端能支持的连接总数就成为瓶颈所在。
    MyCAT在基于Cobar改版时,直接采用了Java 7的AIO,前后端都实现了非阻塞异步。由于Linux并没有真正实现AIO,实际测试下来,AIO并不比NIO快,反而性能上比NIO还要慢。所以MyCAT在2014年下半年,做了一次网络通信框架的大调整,改为同时支持AIO和NIO,通过启动参数让用户来选择哪种方式。虽然现在AIO比NIO慢,但是MyCAT仍然保留了AIO实现,就是为了等Linux真正实现AIO后,可以直接支持。
    Reactor和Proactor
    MyCAT同时实现了NIO和AIO,为了便于读者更清楚理解代码实现,先介绍NIO和AIO分布对应的两种设计模式:Reactor和Proactor
    一般情况下,I/O 复用机制需要事件分享器(event demultBossiplexor). 事件分享器的作用,即将那些读写事件源分发给各读写事件的处理者,就像送快递的在楼下喊: 谁的什么东西送了, 快来拿吧。开发人员在开始的时候需要在分享器那里注册感兴趣的事件,并提供相应的处理者(event handlers),或者是回调函数; 事件分享器在适当的时候会将请求的事件分发给这些handler或者回调函数。
    涉及到事件分享器的两种模式称为:Reactor和Proactor. Reactor模式是基于同步I/O的,而Proactor模式是和异步I/O相关的. 在Reactor模式中,事件分离者等待某个事件或者应用或操作的状态发生(比如文件描述符可读写,或者是socket可读写),事件分离者就把这个事件传给事先注册的事件处理函数或者回调函数,由后者来做实际的读写操作。
    而在Proactor模式中,事件处理者(或者代由事件分离者发起)直接发起一个异步读写操作(相当于请求),而实际的工作是由操作系统来完成的。发起时,需要提供的参数包括用于存放读到数据的缓存区,读的数据大小,或者用于存放外发数据的缓存区,以及这个请求完后的回调函数等信息。事件分离者得知了这个请求,它默默等待这个请求的完成,然后转发完成事件给相应的事件处理者或者回调。举例来说,在Windows上事件处理者投递了一个异步IO操作(称有overlapped的技术),事件分离者等IOCompletion事件完成. 这种异步模式的典型实现是基于操作系统底层异步API的,所以我们可称之为“系统级别”的或者“真正意义上”的异步,因为具体的读写是由操作系统代劳的。
    Reactor与Proactor两种模式的场景区别:
    下面是Reactor的做法:
    1. 等待事件响应 (Reactor job)
    2. 分发 “Ready-to-Read” 事件给用户句柄 ( Reactor job)
    3. 读数据 (user handler job)
    4. 处理数据( user handler job)
      下面再来看看真正意义的异步模式Proactor是如何做的:
    5. 等待事件响应 (Proactor job)
    6. 读数据 (Proactor job)
    7. 分发 “Read-Completed” 事件给用户句柄 (Proactor job)
    8. 处理数据(user handler job)
      从上面可以看出,Reactor和Proactor模式的主要区别就是真正的读取和写入操作是有谁来完成的,Reactor中需要应用程序自己读取或者写入数据,而Proactor模式中,应用程序不需要进行实际的读写过程,它只需要从缓存区读取或者写入即可,操作系统会读取缓存区或者写入缓存区到真正的IO设备.
      最后结合下面的两张图更容易理解(这是别人的图,非原创):\

Mycat 网络通信模块源码

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Mycat 网络通信模块源码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Node.js之网络通讯模块实现浅析

前言想必我们在用Node.js用的最多的应该是创建http服务,所以对于每个Web开发工程师而言,Node.js的网络相关模块学习是必不可少。 Node.js的网络模块架构在Node.js的模块里面,与网络相关的模块有Net、DNS、HTT
2022-06-04

分析python并发网络通信模型

目录一、常见模型分类1.1、循环服务器模型1.2、IO并发模型1.3、多进程/线程网络并发模型二、基于fork的多进程网络并发模型三、基于threading的多线程网络并发四、ftp 文件服务器4.1、项目功能4.2、整体结构设计五、IO并
2022-06-02

从MySQL源码看其网络IO模型

从MySQL源码看其网络IO模型前言MySQL是当今最流行的开源数据库,阅读其源码是一件大有裨益的事情(虽然其代码感觉比较凌乱)。而笔者阅读一个Server源码的习惯就是先从其网络IO模型看起。于是,便有了本篇博客。MySQL启动Socket监听看源码,首先就
从MySQL源码看其网络IO模型
2017-06-01

Node.js dgram模块实现UDP通信示例代码

1、什么是UDP 这里简单介绍下,UDP,即用户数据报协议,一种面向无连接的传输层协议,提供不可靠的消息传送服务。UDP协议使用端口号为不同的应用保留其各自的数据传输通道,这一点非常重要。与TCP相比,占用资源更少,传输速度更快。 2、了解
2022-06-04

Android网络编程之UDP通信模型实例

什么是Android UDP? UDP是User Datagram Protocol的简称,中文名是用户数据包协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。它是IETF RFC 768是UDP的正式规
2022-06-06

Android单片机与蓝牙模块通信实例代码

啦啦毕业了,毕业前要写毕业设计,需要写一个简单的蓝牙APP进行交互,通过参考网上资料,问题顺利搞定,下面小编把具体实现思路分享给大家,供大家参考。 1、Android蓝牙编程蓝牙3.0及以下版本编程需要使用UUID,UUID是通用唯一识别码
2022-06-06

怎样简谈Kafka中的NIO网络通信模型

这篇文章将为大家详细讲解有关怎样简谈Kafka中的NIO网络通信模型,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。摘要:很多人喜欢把RocketMQ与Kafka做对比,其实这两款消息队列的网
2023-06-02

Java网络编程之TCP通信完整代码示例

一、概述  Socket类是Java执行客户端TCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信。Socket类的方法会建立和销毁连接,设置各种Socket选项。  ServerSocket类是Java执行服务器端
2023-05-30

如何理解docker中的网络模式和跨主机通信

今天就跟大家聊聊有关如何理解docker中的网络模式和跨主机通信,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Docker的四种网络模式Bridge模式当Docker进程启动时,会在
2023-06-05

Golang开发建议:如何编写高效的网络通信代码

Golang(又称Go)是由Google开发的一种编程语言,它具有简洁、高效、并发性强等特点,越来越受到开发者的欢迎。在网络通信方面,Golang提供了丰富的库和工具,使得编写高效的网络通信代码变得相对简单。本文将分享一些Golang开发的
Golang开发建议:如何编写高效的网络通信代码
2023-11-22

Python如何制作简易聊天器以及搭建UDP网络通信模型

这篇文章将为大家详细讲解有关Python如何制作简易聊天器以及搭建UDP网络通信模型,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言:互联网的本质是什么?其实就是信息的交换。就比如我们常用
2023-06-22

编程热搜

目录