东风草堂blog

公众号:来风说


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

rpc框架使用

发表于 2022-02-01 | 更新于: 2023-02-12 |
连接池使用需要先构造连接池对象,并完成初始化,连接池可以连接多个rpc服务器,从连接池取连接时会随机取不同服务器的连接,达到负载均衡的效果。 下图中为连接池里面使用的装饰者模式uml类图,从连接池中拿出的ITransportWrapper连接被PoolingTransport装饰后,close功能是自动放回连接池中,而不是真正的close掉连接,同样的,FakeTransport装饰后,IsOpen总是返回true,因为它是一个假冒的连接 连接池连接状态变更图如下,首先打开一个连接,打开成功进入BUSY状态,失败则进入DEAD状态,如果BUSY状态的连接使用过程中出现异常,也会进入DEAD状态。 处于BUSY状态的连接正常运行完成后会被重新放回连接池中,状态变更为IDLE状态,后续可以从连接池中获取IDLE状态的连接来处理新的事务。 对于DEAD状态的连接,需要判断当前活跃连接个数,如果活跃连接已经大于minSize了,直接销毁该连接,变更为CLOSED状态。否则重新打开该连接,让其变更为IDLE状态以备使用,当然如果打开失败,该连接还是处于DEAD状态。 对于IDLE状态的连接,如 ...
阅读全文 »

rpc网络io模型

发表于 2022-02-01 | 更新于: 2023-02-12 |
网络IO主流程TNonblockingServer使用的网络io模型为非阻塞同步io模型,accept由单个io线程处理,recv由多个io线程处理,相应的rpc事务处理由另外的线程池完成,处理完成后通知对应的io线程将处理结果进行send。 accept连接所有网络连接由ioThreads_[0]线程监听端口,在listenHandler中处理,accept后生成一个clientConnection,如果存在多个io线程,ioThreads_[0]线程通过robin算法从所有ioThreads_中选择一个io线程处理事务,即ioThreads_[0]通过pipe管道将clientConnection信息通知被选择的io线程,被选择的io线程此时会收到通知并处理notifyHandler,被选择的io线程在notifyHandler中将clientConnection信息读取出来,再进行recv数据并解析处理。 recv接收接收事务处理都在connection->transition()中进行,首先读取帧长度readWant_,然后根据帧长度调整调整readBuffer_堆区的大 ...
阅读全文 »

golang初探

发表于 2022-01-30 | 更新于: 2023-03-27 | 分类于 clang |
golang使用起来总体感觉比较方便,里面很多思想都是相同的,学习过c/c++的朋友就很容易理解,封装继承多态都差不多,对异常处理有一些不一样,和java比较类似。
阅读全文 »

排序算法二

发表于 2022-01-23 | 更新于: 2024-05-18 | 分类于 算法 |
两种nlogn时间复杂度的排序算法,一个归并排序,一个快速排序。归并排序和快速排序都采用了分治的思想来解决排序的问题,将大问题转化为小问题进行处理,归并排序是由下到上,先划分子问题到不能再划分的地步,再进行合并操作,而快速排序是先分区排序,将分区点放在最终排好序的位置,然后对分区点两边的子数组再进行分区排序处理,所以快排是由上到下进行处理的。归并排序和原始数组的有序程度无关,时间复杂度都是nlogn,但是空间复杂度为O(n),而快速排序大部分情况下的时间复杂度可以做到nlogn,但也有极端情况退化为n^2,另外归并排序是稳定的排序算法,但快排不是,只是快排可以原地排序,空间复杂度为O(1),所以实际使用过程中,还是快排用的比较广泛。
阅读全文 »

排序算法一

发表于 2022-01-19 | 更新于: 2024-05-18 | 分类于 算法 |
冒泡排序、插入排序和选择排序介绍,各有什么优缺点,这三个排序算法最坏时间复杂度都达到了n^2,根据排序效率,是否稳定排序等方面来考虑,优先选择插入排序。
阅读全文 »

微信小程序反编译技术的应用--获取任意小程序的前端源码

发表于 2021-11-07 | 更新于: 2022-04-14 |
使用微信小程序反编译技术来获取任意小程序的前端源码,本篇文章旨在如何学习别人的优秀技术。
阅读全文 »

docker版wordpress的搭建

发表于 2021-10-30 | 更新于: 2023-02-11 |
使用docker容器技术快速搭建wordpress站点,适合有一定程序经验的人操作,使用docker技术方便后续快速迁移。
阅读全文 »

栈的应用

发表于 2021-09-04 | 更新于: 2023-03-07 |
栈在表达式求值中的应用实际上,编译器就是通过两个栈来实现的。其中一个保存操作数的栈,另一个是保存运算符的栈。我们从左向右遍历表达式,当遇到数字,我们就直接压入操作数栈;当遇到运算符,就与运算符栈的栈顶元素进行比较。 如果比运算符栈顶元素的优先级高,就将当前运算符压入栈;如果比运算符栈顶元素的优先级低或者相同,从运算符栈中取栈顶运算符,从操作数栈的栈顶取 2 个操作数,然后进行计算,再把计算完的结果压入操作数栈,继续比较。 栈在括号匹配中的应用这里也可以用栈来解决。我们用栈来保存未匹配的左括号,从左到右依次扫描字符串。当扫描到左括号时,则将其压入栈中;当扫描到右括号时,从栈顶取出一个左括号。如果能够匹配,比如“(”跟“)”匹配,“[”跟“]”匹配,“{”跟“}”匹配,则继续扫描剩下的字符串。如果扫描的过程中,遇到不能配对的右括号,或者栈中没有数据,则说明为非法格式。 当所有的括号都扫描完成之后,如果栈为空,则说明字符串为合法格式;否则,说明有未匹配的左括号,为非法格式。 如何实现浏览器的前进和后退功能?我们使用两个栈,X 和 Y,我们把首次浏览的页面依次压入栈 X,当点击后退按钮时,再 ...
阅读全文 »

c++11函数完美转发之异常处理

发表于 2021-09-04 | 更新于: 2022-04-14 | 分类于 c++ |
什么是完美转发?网上资料很多,简单总结一下,就是通过函数参数传递给函数里面的另外一个函数时,参数的属性不能变化,原来是左值的还得是左值,原来是右值的还得是右值。 左值比较简单,默认就是,关键是这右值,当一个右值当作参数传递给另外一个函数时,这个右值便有了自己的名字,于是变成了左值,这才是问题所在。 1234567funtion(左值) { forward(左值)}funtion(右值) { forward(右值)} 我们要让它进入转发的目标函数参数时也是右值才行,这里需要用到特殊引用和std::forward来解决问题,另外需要了解什么是引用折叠。 异常处理其实,这算是一个需求,当某些函数运行过程中可能会跑出异常时,那么我们需要做catch的操作,否则程序奔溃。 那么我想在调用这个函数时就做try catch操作,做一个包装函数,后续调用这个包装函数就行,这个包装函数保证是不抛异常的。 可以通过入下实现:123456789101112131415161718192021222324252627282930313233343536373 ...
阅读全文 »

基于装饰者模式的thrift连接池实现(C++版本)

发表于 2021-08-19 | 更新于: 2022-04-14 | 分类于 设计模式 |
就一个连接池而已,为什么要采用装饰者模式,听着咋感觉那么高深? 所谓连接池,也就是连接先不close,放入池中,等待下次需要用的时候,直接从池中取出即可用,省去了tcp握手的时间,所以这个可以看作是一个长连接,知道连接池清除空闲连接把多余的连接清除掉才会释放。 而普通的连接,用完后如果生命周期内不再使用了,就会销毁掉。 所以基于普通的连接,要定义出线程池的那种用完放回线程池的连接,就需要把close的方法进行重写,所以可以采用继承的方法实现,相当于产生了两个子类,一个是普通连接类,一个是线程池化的连接类。 如图,如果我还想有个连接,它是优化了传输性能处理的,岂不是还要实现一个具体类?那如果我需要一个线程池化以及优化性能的连接呢?再生成一个类吗?显然不太可取了,类型会变得非常多。 这个时候可以使用装饰者模式来实现。 123456789101112131415161718ThriftTransportPool::init() // 简化实现{ std::vector<std::shared_ptr<ITransportWrapper>> pool; ...
阅读全文 »
1…8910…18
nephen

nephen

173 日志
16 分类
64 标签
GitHub E-Mail
友情链接
  • 新建留言板
  • 订阅号留言板(旧)
  • 订阅号留言板(新)
  • 山楂岛秘密花园
  • 代发短信
© 2016 — 2024 nephen
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4
粤ICP备2022125614号-1
本站访客数 人次 本站总访问量 次