关于我自己
95后码农军团冲锋兵一枚,不断在与脱发斗争中。
关于编程
不应该局限于软件工程师的思维,不应该只写代码,去学习新技术,沟通、管理、理财,你都应该去学习、去了解、去跟上世界成长的脚步。
业余爱好
旅行、运动、篮球、爬山、音乐、英语 -> 是的,就是正常人干的事情
最后
人的这一辈子没法做太多的事情,所以每一件都要做的精彩绝伦
glusterfs也属于典型的cs结构,有client端,server端,通过rpc调用通信 主要的进程有: glusterd: 管理进程,管理所有的配置、版本
本次文章专注于分析rust的协程实现,并提前介绍它与其他语言的协程有什么区别 接下来我们就从有栈和无栈切入了解协程在内存方面的布局,典型的有栈协程就是golan
无向图,邻接表的空间结构: 邻接表主要由数组 + 链表的方式实现 如图表的第一列为数组的索引,代表所有的顶点,0,1,2,3,4 如图表的每一行都对应了第列的所
[toc] 针对稀疏图讲解,且结构按稀疏图-邻接表SparseGraph中的结构进行测试 全局参数和初始化说明全局参数1234SparseGraph graph
寻路的实现是在遍历图的过程中增加一个数组from,from[i]记录了到i节点的源节点 例如: 0 - 2 由0开始访问到节点2,那么有: from[2] =
dijkstra利用松弛操作找到最短的路线距离,假设当前图结构为稀疏图,结构如下: 按照直观来说,0-4的最短路径有如下几种选择 最优路显然是0-2-3-4,权
github: https://github.com/brewlin/garbage-collect 当前实现的三色标记是一种增量式-标记清除算法,解决了标记清
github: https://github.com/brewlin/garbage-collect 分代垃圾回收也是一种组合算法实现(gc复制 + 标记清除)
github: https://github.com/brewlin/garbage-collect 当前所有的gc实现都是基于保守式gc实现的,特点就是实现简
github: https://github.com/brewlin/garbage-collect two-finger相比lisp2而言优化了gc效率,只需
github: https://github.com/brewlin/garbage-collect 压缩算法,也是一种充分利用空间解决内存碎片的算法。相较于复
github: https://github.com/brewlin/garbage-collect copying-or-marking是一种组合算法,结合了
github: https://github.com/brewlin/garbage-collect 复制算法,安全解决了标记清除算法中内存碎片的问题,每次执行
github: https://github.com/brewlin/garbage-collect 所有gc算法中引用计数最为特别, 相较于其他算法来说最明显
github: https://github.com/brewlin/garbage-collect 多链表法相较于单链表法提升了分配速度,在之前的gc_mal
github: https://github.com/brewlin/garbage-collect 本系列文章主要阅读垃圾回收的算法与实现一书进行的实现解说,
什么是最小生成树 在一个有权图中,所有的边连接为一个图,那么用最少的边将所有节点连接起来且该连接和最小,可以称为最小生成树 如上图: 图中==红色边==连接起来
github: https://github.com/brewlin/garbage-collect heap也就是堆,本意应该是系统堆的概念的,现代的语言为了
github: https://github.com/brewlin/garbage-collect 讲root根之前我们要先理解什么是gc 回收,怎么定义垃圾
github: https://github.com/brewlin/garbage-collect 标记-清除 算法主要分为两个过程:标记O(N)、清除O(N
本节主要讲解什么是多线程协程的投递、调度、以及切换的汇编实现 Goos-多线程协程实现简要 Goos-协程底层实现(一) Goos-线程协程隔离(二) Goos
本节主要讲解什么是协程、协程的实现、php的协程封装的内容,从为什么我们需要协程到如何实现协程,主要讲解协程、php、c、汇编指令的相关关系,从整体窥探它的整个
简介Goos 是一个借鉴Golang的多线程协程调度器的设计而利用C++实现的PHP扩展。笔者在接触golang的协程调度器的力量后不能自拔,感受到协程的魅力后
事件模型概述主要分为两个方面事件收集器、事件分发器 事件收集器也就是向epoll添加、更新、删除等事件,让epoll事件去管理 EPOLL_CTL_MOD EP
@http_process_init 主要启动函数上面cycle初始化的时候start_module启动的就是当前http入口模块函数1234567891011
main启动函数主要调用init_cycle() 进入框架事件循环123456789101112131415161718int main(){ cyc
简介github: https://github.com/brewlin/just-for-fun/mini_nginx mini_ngx 主要是抽取出ngin
事件模型概述主要分为两个方面事件收集器、事件分发器 事件收集器也就是向epoll添加、更新、删除等事件,让epoll事件去管理 EPOLL_CTL_MOD EP
连接池概述nginx的连接池是属于短链接池的,因为主要业务场景为代理服务器,生命周期是有限的,下面来看看两种类型的连接池的区别 长连接连接池我们说连接池一般指的
@container_of 定义在看linux_os_link.c内核链表的时候,看到的一个高级技巧,通过结构体偏移量定位实际对象的指针地址 定义如下:123#
demo1234567891011121314<?phppool=newLib\Thread\Pool(4);ref = [1,2,3,4];/
内存池主要作用nginx里几乎所有内存申请都是从ngx_pool_t上申请的,nginx封装了自己的内存池技术提升性能主要有三点好处,内存分配速度快,防止内存碎
@封装发送包体123456//protocol/appliction/dns/endpoint.go h := header.DNS(make([]byte,1
@整体包结构 header+bodyDNS请求与响应的格式是一致的,其整体分为Header、Question、Answer、Authority、Addition
1234567891011121314151617181920212223242526272829package mainimport ( "fmt" "git
@客户端创建12345678910111213141516171819202122232425262728package mainimport ( "fmt"
http 流程的生命周期在开发模块前我们需要了解http流程的生命周期,然后确定我们需要扩展的功能在哪个阶段,最后才能在该阶段介入我们扩展的功能。 nginx
@annotation注解扫描 @config配置读取 @container容器单利初始化 @eventswoole事件封装 @context携程上下文 @po
@env 配置文件discovery.php1234567891011121314151617181920212223242526272829303132<
@设置结果集为 array1234567891011121314151617181920use Core\Event\EventDispatcherInterf
@producer 生产数据12345use App\Lib\Producer;/** @var Producer producers∗/producer
@build123> cd pkg/grpc/bin> sh gen.sh....... @method grpc 调用组件封装有连接池机制,复用多
@construct使用bean注解自动注入到container中,在swoole启动前就需要申请好内存并初始化,所以需要使用bean注解12345678910
@construct1234567891011121314151617181920212223use Process\Contract\AbstractProc
@class1Redis::hSet("hkey",key,server); @api12345678910111213141516171819202122
@Log 输出到日志文件 && Clog 输出到终端@emergency level12Log::emergency(message,param
@composer12345{ "require":{ "brewlin/im-task" }} @class12cla
在扩展内替换原生php内置sleep函数,使原有基于sleep的代码自动进行替换为协程Cco::sleep()调用 @协程sleep123cgo(functi
Lib\runtime::enableCorutine 启动hook机制123456<?phpLib\Runtime::enableCoroutine(
read…
123456lib_event_init();dosthing...lib_event_wait(); @lib_event_init() 初始化全局变量和申请
创建协程版socket,封装所有协程api,所有阻塞操作都会触发协程切换 @Lib\Coroutine\Socket1234567891011121314151
进行php扩展开发的时候会遇到一些问题,就是php用户态空间将变量传递到扩展层面c层调用的时候,会出现一些问题,下面的例子是一个timer定时器的例子。用户空间
1.创建一个tap模式的虚拟网卡tap01sudo ip tuntap add mode tap tap0 2.开启该网卡1sudo ip link set t
demo123456789101112131415161718192021<?phplib_event_init();//定时器 毫秒单位 循环触发$ti
@客户端创建12345678910111213141516171819202122232425package mainimport ( "fmt" "githu
将协程任务保存到扩展事件中进行调度 @cgo12345678910//初始化全局对象 epoll等内存空间初始化lib_event_init();//协程运行c
创建协程版server,封装所有协程api,所有阻塞操作都会触发协程切换 @Lib\Coroutine\Server1234567891011121314151
@Lib/SharMem该扩展申请一块共享内存地址,提供php调用,用于多进程间共享数据123456//初始化传入内存大小 单位字节 bytes$obj = n
@Lib/Process该扩展初始化传入回调函数并创建子进程执行,子进程间可以通过channel通讯1234567891011121314<?php$pr
123456789101112131415161718192021222324#ifndef _SHMEM_H_INCLUDED_#define _SHMEM_
12345678910111213141516171819202122232425262728293031323334353637383940414243444
共享内存本质为通过系统调用申请一块内存,由系统调用,该内存可以跨进程间使用,有是那种共享内存的申请方式 采用mmap 方式申请共享内存 采用文件映射方式申请共享
@客户端创建12345678910111213141516171819202122232425262728package mainimport ( "fmt"
demo案例cmd:该目录下为各协议的实现demo,提供api调用实现以及测试 环境配置 需要配置相关的参数 config/net.go 如果应用层协议要与外网
@客户端创建123456789101112131415161718192021package mainimport ( "fmt" "github.com/br
简介tap属于2层协议,也就是他能够像读取文件一样获取拥有完整的数据包,包括以太网封装的mac目的地址和源地址等。拥有自己的ip地址和网段、mac地址、等信息,
http api接口开放api推送接口,暴露http接口,提供用户业务推送功能1234HttpRouter::post("/im/push/keys","/Ap
im-cloud/apps 为单线程协程化版本,协程server、协程httpserver、协程websocekt协议等实现cloud-s,job-s,logi
im-cloud/appm 为多进程Worker-Task模型构建服务,基于Swoole\Server,Swoole\Http\Server等实现cloud-m
多进程与单线程协程版本都依赖与 pkg/Core 核心组件 单线程协程版 重写了App/Application -> run()方法,并替换掉协程模式的s
1234当前网段为:192.168.1.0/24当前网络ip:192.168.1.1源mac地址 :aa:00:01:01:01:01广播地址 :ff:ff:f
@客户端创建12345678910111213141516171819202122import ( "fmt" "github.com/brewlin/net-
接收端在给发送端回 ACK 中会汇报自己的 AdvertisedWindow,而发送方会根据这个窗口来控制发送数据的大小,以保证接收方可以处理。要明确的是滑动窗
@fin_wait1 状态四次挥手中,主动关闭方发送fin报文后,进入find_wait1状态 @close_wait四次挥手中,表示接受到对方fin报文,并发
UDP 计算校验和的方法和 IP 数据报首部校验和的方法相似。不同的是:IP 数据报校验和只校验 IP 数据报的首部,但 UDP 的校验和是把首部和数据部分一起
协议运作其实就是将对应协议之间关联到协议都要先注册。在分流器中统一管理,数据包到达后一层一层解刨在转发到对应到业务层处理 例如监听tcp服务,需要注册 ipv4
以太网头部1234567890 1 2 3 4 5 60 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2
虚拟网卡tap启动关闭到工具 up123cd path/toolgo build up.gosudo ./up down123cd path/toolgo bu
流程架构
推送流程总的来说logic暴露api接口服务,处理推送http请求,并通过队列的方式让job来消费该任务。最后通过grpc通知cloud节点推送实际的链接1lo
@注册服务file:app/Process/Discovery.php123456789101112131415161718192021222324252627
简介实现机制基于swoole channel实现,channel大小默认为10,每次获取连接时判断如果连接池为空,则新建连接,并在结束时放回channel中,放
基于Swoft-cloud微服务架构-Im通讯平台@概述 对swoole-im进行服务拆分,进行微服务架构(https://www.github.com/bre
im-cloud 基于swoole 原生协程构建分布式推送中间件一、概述 基于swoole原生协程构建商业化即时推送im服务中间件,不进行业务处理,单独作为中间
ICMP 协议ICMP 的全称是 Internet Control Message Protocol 。与 IP 协议一样同属 TCP/IP 模型中的网络层,并
ARP 协议基于arp协议,获取对应的物理mac地址,虽然同属于ip层到网络层协议,但是arp数据包没有被封装进ip数据包里,而是直接封装在以太网帧中 上层tc
IP 报文协议首部协议格式 123456789101112131415161718190 1 2 3 40 1 2 3 4 5 6 7 8 1 2 3 4 5
端口端口在tcp协议中的体现端口一般在tcp首部前四个字节中,前2字节表示源端口 后两字节表示目标端口 1.周知端口(Well Known Ports)周知端口
tcp 流量控制tcp是由丢包重传的机制的 那么如果服务端因为负载导致不能接受发送端的数据从而丢弃数据 发送端接受到ack确认为丢包后导致重传 然后服务端导致负
tcp 可靠性机制可靠性指的是网络层能通信的前提下,保证数据包正确且按序到达对端。 比如发送端发送了“12345678”,那么接收端一定能收到“12345678
udp协议udp协议 包体 源端口 源端口号 目的端口 目的端口号 长度 UDP 数据报的长度,包含首部,最小为 8 检验和 UDP 数据报的校验和,如果接收到
[toc] 传输层 tcp 协议 实现 首部协议格式12345678910111213141516171819 0 1 2 3 0 1 2 3 4 5 6 7
编写基本的httpserver启动一个基本的httpserver,提供两个接口,一个index返回主页,另一个是就是我们自定义的websocket协议接口@ma
websocket协议中的一些算法在分析 WebSocket 协议握手过程和数据帧格式过程中,我们讲到了一些算法,下面我们讲解下具体实现。 Sec-WebSoc
websocket 协议报文websocket协议也是基于tcp协议,和http不同的是,tcp接受的数据包为二进制帧,而http为字符串数据包。并且webso
http协议报文这是一个典型的http请求的报文样例,可以看出是一个websocket升级前的http请求。该字符报文完全基于tcp协议,协议报文内容为tcp数
应用层的作用对传输层协议对再次封装,例如对tcp进行封装对http、websocket协议等,以及http3协议基于udp协议的封装等 http协议报文1234
基于c ,c ++ 封装php对象扩展@Lib所有的扩展对象均以Lib 命名空间为开头1namespace Lib; @env123supoort:> p
REB-BLACK TREE 红黑树 struct 需要提供 Less() Mor() Equal()等可以比较的方法,在红黑树add, remove,get
简介二分搜索树,基础版的实现,用于展示,因为在多种情况下效率比较差,没有自平衡,会退化成链表等,建议使用红黑树,或者hash表等, @NewBSTree12/
简介基于链表桶的hash算法,hashcode 采用 map底层的hashcode方式生成 @源码1234567891011121314151617181920
简介hashcode 采用map底层的hashcode 方式,提前源码重新封装实现,最大实现hashcode生产效率 源码1234567891011121314
领接矩阵 和 领接表领接表适合表示稀疏图 sparse graph 领接矩阵适合表示稠密图 dense graph 稠密图 和完全图领接矩阵 领接表领接矩阵
raft分布式一致性原理无限循环选leader异常当启动所有server时,默认都是follower 此时没有leader角色,然后follower会转换成ca
参考资料动画演示 raft 协议http://thesecretlivesofdata.com/raft/ raft 比较好的bloghttp://oserro
@1 选举此阶段为集群初始化,所有的节点都是FOLLOWER身份 进行事件循环 @fllower 身份 接受主节点心跳 接受投票选举 如果在超时时间里还没有处触
im-cloud分布式中间件分析-job节点实现1.概述 job 节点 作为消费端,消费logic生产的数据,然后通过grpc推送至cloud节点,cloud点
im-cloud分布式中间件分析-logic节点实现1.概述 logic 节点 作为生产者和client端,作为业务节点,提供push推送resetapi接口,
基于原生 swoole 全协程化构建 im-cloud中间件,多节点扩容 https://github.com/brewlin/im-cloud 概述 基于sw
通讯协议@heartbeat 心跳注意心跳是10s间隔,如果20s还未收到心跳则断开连接
im-cloud <> goim 分布式中间件并发压测对比系统环境 此次测试环境为 window8.1 启动 virtualbox虚拟机部署的ubu
im-cloud 分布式中间件的安装部署 github:http://github.com/brewlin/im-cloud im-cloud 基于swoole
im-cloud分布式中间件分析-cloud节点实现1.概述 cloud 节点对外提供websocket、tcp client 注册。并维护每个连接对应的客户端
net-protocolhttps://github.com/brewlin/net-protocol基于go 实现链路层、网络层、传输层、应用层 网络协议栈
简介基于链表的队列 push:O(1) Pop:O(1) 入队和出队都可以达到O(1) 的时间复杂度。因为链表维护了头结点和尾节点从而使入队和出队都是O(1)
github:https://github.com/brewlin/go-stl @containers 算法库 lru缓存算法 @hash 基于双向链表等ha
简介字典树是一种对字符串统计效率非常高的一种算法,当前字典树基于红黑树实现 @NewTrie12345import ( "github.com/brewlin/
相关文章笔记、源码分析、模拟实现等BLOG @compiler编译器相关分析与实现 @algorithm gc-learning: 各系列gc算法实现 grap
关于我自己95后码农军团冲锋兵一枚,不断在与脱发斗争中。 关于编程不应该局限于软件工程师的思维,不应该只写代码,去学习新技术,沟通、管理、理财,你都应该去学习、