高并发
孔令宽
从事安卓、前端富客户端、java后台、netty的开发和研究
展开
-
关于Vertx Session处理的坑点避免
vertx的sessionHandler在使用集群sessionStore的时候 ,刷新本地session到最终sessionStroe的时机是:即:在每次响应结束的时候(调用response.end())触发这个回调函数,这个回调调用flush来将本地的session数据刷新到sessionStroe。如果不熟悉这个处理流程,很可能在开发业务处理handler的时候进入坑点: 如果在业务处理Handler中先执行了response.end()然后又往session中put了数据,就会导致put原创 2021-01-27 15:47:19 · 517 阅读 · 0 评论 -
吐血加死一窝脑细胞--记录vertx3版本框架bug发现和解决策略
场景:http流代理精力和代价: 三天一夜 无数调试和尝试问题发现:对于tomcat等目标服务器,如果尝试用post文件流的形式尝试访问一个简单的get请求的小文件,比如localhost:8080/tomcat.png,现象会是怎样呢?尝试如下过程得出结论:1 通过postman发起一个大文件流给tomcat,可以立马得到响应,多次发起多次响应没任何问题,看不出任何端倪,监控磁盘也没有发现有大的磁盘IO,初步结论,tomcat不会收取大文件流2 通过自己写httpclient post一个原创 2020-09-20 12:16:08 · 494 阅读 · 0 评论 -
跟我学代码架构设计模式之--再次理解同步IO和异步IO
先虚拟一个硬件IO的例子做比喻:1 同步IO:有这么一个硬件设备,该设备可以用来存储数据,但是设备本身不具备自己的CPU,所有的数据读写操作都只能靠计算机的主CPU来完成,这样的读写相对与主CPU来说就是同步IO。2 异步IO:有这么一个设备,该设备可以用来存储数据,和1中不同的是,该设备具备自己的CPU,具有一定的自主性,当设备的数据可读时可以向主CPU发送事件通知来完成读,当主CPU将...原创 2019-01-29 21:31:15 · 243 阅读 · 0 评论 -
跟我学代码架构设计模式之--命令式编程、流式编程、异步、同步、阻塞非阻塞概念理论大一统
一直以来各种编程概念充斥于耳-命令式编程、流式编程、函数式编程、异步编程、同步编程、阻塞编程、非阻塞编程、reactor模型、、潜意识里我总觉的这些概念之间有关联又没有关联的样子,今天我总于有所领悟----它们之间是围绕着一个理论基础的!!!即---数据推拉模型的不同!!! 看本文之前请先看我上篇文章,我的观点如下:首先命令式编程是数据“拉”模型,我们的业务代码要负责数据的拉取,然后处理,...原创 2019-01-29 16:56:01 · 328 阅读 · 0 评论 -
跟我学代码架构设计模式之--异步编程拥塞控制
前言:传统同步阻塞编程模型中,我们最关注的问题是线程不够用,即没有充分利用计算资源,到了异步编程模型中,我们的线程资得到了充分的利用,但是我们要开始关心内存资源问题了,所以我们要在设计系统的时候做好拥塞控制,避免内存OOM的发生。这里额外的说一下:一说到同步异步编程,我们很容易的和IO尤其是socket的阻塞非阻塞联系起来,原因是明显的:传统的同步编程模型,阻塞线程的部分基本都是做IO的时候导...原创 2019-01-29 10:57:45 · 194 阅读 · 0 评论 -
跟我学代码架构设计模式之--高并发服务器应用层协议栈设计要点
要设计一个高并发的服务器,应用层协议栈应该满足如下设计思路:协议栈要分成底层、中层、和高层,线程要分为IO线程和业务线程:一、底层连接要采用NIO多路复用、事件通知二、中层要完成原始TCP数据流到业务层消息的协议编解码三、高层负责上层业务消息分发和收集(读和写)要完成:提供上层读写API和事件通知、提供底层连接状态获取相关的API 提供IO线程和业务线程之间的切换,比如读AP...原创 2019-01-16 16:53:55 · 257 阅读 · 0 评论 -
跟我学代码架构设计模式之--高并发高吞吐模型演变
高并发、高吞吐是我们追求的目标,最大化压榨单机的性能来达到更多更快的服务。首先说下,为什么会有这么多模型演变,本质原因是因为操作系统底层提供的线程模型不够牛逼,不能满足我们的服务需求!模型演变如下:第一代:操作系统线程无限开模型基本原理是业务请求来了以后直接开启一个线程进行后台处理,业务中包含阻塞等待的时候,直接挂起操作系统线程。这种模型的缺点是明显的,本质原因是操作系统的线程...原创 2019-01-27 11:21:47 · 418 阅读 · 0 评论 -
跟我学代码架构设计模式之--谈网络协议的设计和吞吐量的关系
首先谈几个名词: 协议设计 、IO阻塞与非阻塞、业务阻塞与非阻塞、协议处理吞吐量首先,IO的阻塞与非阻塞其实和协议的设计没有任何关系,任何协议,包括HTTP协议其实都可以设计为IO阻塞模型和非阻塞模型,比如传统的servlet模型就是IO阻塞模型,如果抛弃servlet,用NIO的多路复用完全可以实现一个IO非阻塞的HTTP协议模型。业务的阻塞非阻塞指的是业务层面上是不是需要用户等待结果的...原创 2019-01-16 16:01:22 · 303 阅读 · 0 评论 -
跟我学代码架构设计模式之--服务高并发高吞吐架构设计基本原理
首先我说的设计是指的最大限度提高单机单节点的服务吞吐和并发。我们设计一个服务器程序,自用户层->业务实现层->操作系统层,我们要明确的前提或限制有如下:1 服务程序要保证高吞吐量!服务程序要为用户服务,应该尽可能多的接收和处理用户的业务处理请求2 对于每个业务处理,业务层面的等待和阻塞不可以避免!(因为业务上获取任何资源数据都是需要时间的,比如数据库访问)3 在操作系统...原创 2019-01-26 10:45:40 · 492 阅读 · 0 评论 -
跟我学代码架构设计模式之--从操作系统到应用层面看如何高并发
一、应用层使用操作系统层面的多线程来做高并发通过线程和定时器实现任务切换。本源思想是每个线程执行一个业务代码1 业务代码阻塞的时候业务代码主动让出CPU2 通过硬件定时器中断CPU,强制剥夺线程的CPU执行权缺点:应用程序使用这种方式来高并发必须要开N多个线程,虽然通过业务让出CPU执行并没有浪费CPU时间,但是操作系统层面每个线程都维护了一个线程上下文:首先,每个线程...原创 2019-01-08 10:59:06 · 436 阅读 · 0 评论 -
跟我学代码架构设计模式之--简单的对象和线程关联关系分析要点
并发编程尤其是异步并发编程,脑中必须要有对象在内存中的清晰分布图景以及对象和线程的关联关系分布图景。要想掌握异步编程,我的观点是:要以业务对象为中心,分析对象和线程的关联关系!!!!!!!!!因为即使是异步多线程编程,最终的业务流程流转也是以对象为中心的,比如说多线程间消息的交互,本质上也是对象间的相互作用!根据我的总结,一般需要掌握如下几点关系:1 对象的创建者是哪个线程。2...原创 2019-01-13 13:46:09 · 265 阅读 · 0 评论 -
跟我学代码架构设计模式之--孔氏并发定理
前言:并发的根本是减少线程阻塞等待的时间,有两种阻塞:一种是业务上的代码架构设计导致的状态共享加锁导致的阻塞一种是对特定资源的等待导致的阻塞。只有同时避免了两种阻塞等待,才能达到真正的并发最大化!一、如何取消状态共享锁导致的阻塞。角色:特定时间段、 线程、状态(只读状态数据、可脏写状态数据、安全状态数据)状态指的是堆区数据,按业务特征可以分为:只读状态数据、可脏写状态数...原创 2019-01-12 11:37:02 · 217 阅读 · 0 评论