- 博客(47)
- 收藏
- 关注
原创 阿里云中间件2024届校园招聘
阿里云云原生中间件团队负责分布式软件基础设施,为阿里云上万家企业提供如微服务引擎、服务网格、消息服务、分布式事务等分布式基础服务,加速企业上云的进程和创新速度。同时,云原生中间件团队也服务着阿里集团众多核心业务和场景,是支撑双十狂欢节的最核心团队之一。我们的愿景是:打造世界一流的中间件产品,打造世界一流的企业级互联网架构平台。我们的使命:做分布式架构基础设施,支撑百万台服务器和超万个系统的分布式架构和服务能力。
2023-02-03 15:48:58
592
1
原创 路由
数据结构路由函数操作表struct fib_table { struct hlist_node tb_hlist; //用来将各个路由表连接成一个双向链表 u32 tb_id; //路由标识,最多可以有256个路由表(静态路由、策略路由等等表项) unsigned tb_stamp; int tb_default; ...
2019-02-27 20:37:32
668
原创 RocketMQ之Producer异步消息发送
调用producer的send()方法,并传入msg跟回调callBack实例。DefaultProducer的send方法调用DefaultProducerImpl的send方法,该方法直接调用sendDefaultImpl方法,并传入msg、communicationModel、回调callBack实例、跟默认的timeout。public enum CommunicationMode ...
2019-02-26 08:42:03
10478
原创 socket 源码解析之创建
数据结构/** * struct socket - general BSD socket * @state: socket state (%SS_CONNECTED, etc) * @flags: socket flags (%SOCK_ASYNC_NOSPACE, etc) * @ops: protocol specific socket operations * @...
2019-02-25 17:23:54
1302
原创 Linux内核源码解析 - CFS调度算法
进程调度,那么先从进程描述符的数据结构开始struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ void *stack; atomic_t usage; unsigned int flags; /* per process flags, defined belo...
2018-10-11 17:05:36
1526
原创 ElasticSearch集群选举
上一篇分析了es集群选举前,每个节点通过ping()获取集群内其他节点的信息。这一次从整体分析下es集群选举master的流程。在Node节点的start()方法中,通过discovery.startInitialJoin()方法开始加入集群,并参与选举。 @Override public void startInitialJoin() { // start...
2018-08-10 18:28:26
3237
原创 ElasticSearch之UnicastZenPing
在构造方法中,完成了配置等操作,从配置中读取其他节点ip信息存到configuredHosts中,配置操作超时的时长,以及注册远程数据传输服务,完成线程池的构造,这里还对discovery/zen/unicast注册了requsetHandler用于处理同集群其他节点传来的ping请求的处理。 public UnicastZenPing(Settings settings, Threa...
2018-08-09 01:25:07
1238
原创 ElasticSearch之PrioritizedEsThreadPoolExecutor
PrioritizedEsThreadPoolExecutor优先级线程池,顾名思义,根据线程任务的优先级来提供线程,每次提供优先级最高的线程任务,还没看实现前我们可以来思考一下如何做到,普通线程池提供的是线程队列,那么每次仅需要得到优先级最高的线程任务,那么可以改成使用优先队列,优先队列本质不过是堆。先看下PrioritizedEsThreadPoolExecutor的构造Priori...
2018-08-06 00:55:59
575
原创 SpringBoot之SpringApplication(2)
我们回到SpringApplication的run方法继续分析。 public ConfigurableApplicationContext run(String... args) { StopWatch stopWatch = new StopWatch(); stopWatch.start(); ConfigurableApplicationContext context = nu...
2018-07-15 15:53:30
665
原创 SpringBoot之SpringApplication(1)
总算是怀着热切的心情打开了spring boot的源码,不知道能看到怎么样的结果,不过算是能压抑期末考紧张的心情。启动类,都是调用SpringApplication的run()方法,传入的是加入@Configuration注解的类,跟String数组类型的参数。...
2018-07-07 10:56:25
497
原创 Netty之FastThreadLocal
FastThreadLocal,看名字就可以知道,netty君让其优化了。我们先来看看ThreadLocal哪里慢了需要fast,上一篇分析我们知道,Thread内有一个ThreadLocalMap的成员,该成员相当于一个map(数组+线性扫描),该map以ThreadLocal为key,若要定位到相应的value,需要两步。先是根据ThreadLocal的hashCode取余定位到数组的小标,因...
2018-07-04 13:10:01
726
原创 jdk源码之ThreadLocal
ThreadLocal算是为多线程解决并发问题提供了一种新的思路,为了更好地使用它,读其优秀的实现。其构造方法是空的,那么直接看其set()方法 public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (ma...
2018-07-02 21:00:46
268
原创 Rocket之事务消息二阶段提交
在生产者Producer中,通过sendMessageInTransaction()方法发送事务消息,这里先向Broker发送一条预处理消息,sendMessageInTransaction()方法中,传入了需要发送的事务消息跟实现了LocalTransactionExecuter接口的tranExecutor实例跟参数,在其中的executeLocalTransactionBranch方法中实现...
2018-07-01 21:54:45
3427
原创 RocketMQ之broker消息索引
我们可以知道,broker的消息完全顺序地存储在commitLog上,且每条消息的大小不一致,如果我们根据不同的主题查,或者根据消息id查找都要遍历整个commitLog文件,那肯定是不合理的。(要提一下,消息的一个主题topic,在一个broker上可以分成多个消息队列,默认是4个,也就是消息队列是基于topic+broker),所以RocketMQ采用了ConsumerQueue文件存储定长的...
2018-06-27 13:15:35
1083
原创 RocketMQ之broker主从同步的实现
我们可以看到在DefaultMessageStore的start方法中通过haService的start()方法启动自己的HA服务。 public void start() throws Exception { this.acceptSocketService.beginAccept(); this.acceptSocketService.start(); ...
2018-06-25 21:46:43
2382
原创 go的rpc
我们先从服务端开始分析,先调用rpc.register方法注册暴露的服务对象。里面调用了DefaultServer的register方法func (server *Server) register(rcvr interface{}, name string, useName bool) error { s := new(service) s.typ = reflect.TypeOf(rcvr)...
2018-06-24 19:29:22
1783
原创 RocketMQ之PushConsumer的启动
之前分析了PullConsumer的整个流程,这次来看看PushConsumer的启动流程,老样子我们来看DefaultMQPushConsumer的构造 public DefaultMQPushConsumer(final String consumerGroup, RPCHook rpcHook, AllocateMessageQueueStrategy allocate...
2018-06-24 00:58:01
11442
原创 RocketMQ之broker消息存储
从broker启动的注册处理器配置中可以看到 public void registerProcessor() { /** * SendMessageProcessor */ SendMessageProcessor sendProcessor = new SendMessageProcessor(this); ...
2018-06-21 17:27:35
1415
原创 RocketMQ之PullConsumer消息拉取实现
PullConsumer拉去消息需要自己调用pull方法主动去拉取消息,调用DefaultMQPullConsumer的pull方法。 public PullResult pull(MessageQueue mq, String subExpression, long offset, int maxNums, long timeout) throws MQClientExce...
2018-06-19 21:23:47
4561
原创 RocketMQ之Pull消费者客户端启动
Pull消费者客户端(主动拉取消息的消费者)即构造了DefaultMQPullConsumer对象,DefaultMQPullConsumer继承了ClientConfig类。我们先看其构造方法 public DefaultMQPullConsumer(final String consumerGroup, RPCHook rpcHook) { this.consumerGr...
2018-06-19 17:32:29
2134
原创 RocketMQ之Producer启动
RocketMQ中的生产者通过构造DefaultMQProducer实例,我们来看下DefaultMQProducer。 protected final transient DefaultMQProducerImpl defaultMQProducerImpl; private String producerGroup; private String createTopicK...
2018-06-14 21:01:51
4858
原创 jdk1.8中ConcurrentHashMap
ConcurrentHashMap我们先看其构造方法,主要是对内部的大小进行配置 public ConcurrentHashMap(int initialCapacity, float loadFactor, int concurrencyLevel) { if (!(loadFactor > 0.0f) || ...
2018-06-12 15:28:00
311
原创 Quartz中的定时任务
Quartz中管理的stdScheduler内部对应的是一个QuartzScheduler,看其构造方法 public QuartzScheduler(QuartzSchedulerResources resources, long idleWaitTime, @Deprecated long dbRetryInterval) throws SchedulerExceptio...
2018-06-11 15:39:08
1513
原创 Ribbon负载均衡策略之WeightedResponseTimeRule
WeightedResponseTimeRule这个策略每30秒计算一次服务器响应时间,以响应时间作为权重,响应时间越短的服务器被选中的概率越大。 public void setLoadBalancer(ILoadBalancer lb) { super.setLoadBalancer(lb); if(lb instanceof BaseLoadBalance...
2018-06-10 14:22:41
5042
原创 Dubbo源码之服务端暴露流程
我们从AnnotationBean#postProcessAfterInitialization为入口分析 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if (! isMatchPackage(bea...
2018-06-03 15:22:40
365
原创 Dubbo源码消费者端服务的订阅流程
关注消费者端服务的订阅,我们从ReferenceConfig中的createProxy()开始分析,我们重点先关注其中的一句,当注册中心只有一个(单个或集群)时进入此分支即执行下面这一句。(关于createProxy整个流程会在后面博文中重点介绍)invoker = refprotocol.refer(interfaceClass, urls.get(0));其中refprotocol = Ext...
2018-05-31 21:58:39
965
原创 Dubbo源码之消费者端代理调用
由上一篇博客我们知道,消费者端调用服务,实际上是调用代理的invoke方法,内部是调用传入的handler的invoke()方法。这里是调用了InvokerInvocationHandler的invoke()方法,我们来看下具体逻辑。 public Object invoke(Object proxy, Method method, Object[] args) throws Throwab...
2018-05-30 23:44:26
662
原创 Javassist代理 Dubbo源码
代理在Dubbo中用到很多,无论是服务暴露端生成的invoker代理或者是消费者端的代理调用。Dubbo中默认采用javassit代理在内存中动态生成所代理的字节码。我们来看下JavassistProxyFactory中的代码 public <T> T getProxy(Invoker<T> invoker, Class<?>[] interfaces) ...
2018-05-30 13:31:27
517
原创 Dubbo源码@SPI
SPI机制,即对同一个接口会有不同的实现类,我们可以根据应用场景通过配置来选择使用不同的实现类。在Dubbo中,protocol的选择就是通过@SPI来实现。其SPI目的是遵守开闭原则的面向对象设计,对于变化点的可扩展性,利用配置式服务发现机制动态加载相关接口实现类。 在分析ReferenceConfig类中,获取相应协议的protocol作为扩展点。协议protocol的选择并没有在代码中显式表...
2018-05-29 20:22:34
251
1
原创 jdk的nio之selector(3)
来看看selector最核心的select()方法吧我们之前分析了Selector默认是WindowSelectorImpl的一个实例,调用selector(timeout),timout是给Selector设置的时间参数,之后调用lockAndDoSelector,lockAndDoSelector方法核心就是调用抽象方法doSelect,此时加了synchronize同步。我们看下子类的doS...
2018-05-24 13:21:17
428
原创 jdk的nio之selector(2)
上篇博文分析了selector的建立,在这之后selector跟ServerSocketChannel,SocketChannel配合使用,在这里我将会介绍在selector.open();之后,我们以服务器端为切入点,重点关注下面两个方法的实现 ServerSocketChannel serverSocketChannel = ServerSocketChannel.ope...
2018-05-23 16:14:30
358
原创 jdk的nio之selector(1)
看了netty源码后发现,它不过是封装在jdk的nio之上的框架,虽然大致猜到nio的原理,但还是忍不住要去jdk底层一探究竟。要用selector,第一句话无非Selector selector = Selector.open();但里面如何实现的? public static Selector open() throws IOException { return Sele...
2018-05-22 21:51:59
370
原创 zookeeper中的默认选举过程
zookeeper的3.4.0后默认Leader选举算法只保留了Tcp版本的FastLeaderElection算法,该算法的启动在QuorumPeer中的start()方法中,的tLeaderElection()方法。 synchronized public void startLeaderElection() { try { currentVote = new Vo...
2018-05-22 14:13:49
1349
原创 netty内存池之PoolArena
之前做了那么多铺垫,在这篇博文,我们将看清netty内存池管理的全貌。PoolArena是一个抽象类,其子类为HeapArena和DirectArena对应堆内存(heap buffer)和堆外直接内存(direct buffer),除了操作的内存(byte[]和ByteBuffer)不同外两个类完全一致)。PoolArena管理了之前一系列的类,这里讲介绍它的实现细节。该类的实现接口是PoolA...
2018-05-21 21:03:08
1887
原创 netty内存池之PoolChunkList
PoolChunk的上层还抽象出一个管理类,PoolChunkList,它负责多个chunk的生命周期,以及一些内存分配的优化,直接看源码吧。 private static final Iterator<PoolChunkMetric> EMPTY_METRICS = Collections.<PoolChunkMetric>emptyList().iterator(...
2018-05-21 18:53:03
491
原创 netty内存池之poolSubpage
PoolChunk负责内存的分配与释放,其内部最小的分配单元为page,page的默认大小为8k。如果我们申请很多小块内存时,都按照page来分配,那么资源浪费可不是一点半点。针对这个问题,netty将page拆成了更小的内存块element,但超出了PoolChunk的负责范围,此时netty使用PoolSubpage来解决这个问题。PoolSubpage(PoolSubpage<T>...
2018-05-21 16:11:52
540
原创 Netty内存池之PoolChunk
netty4之后,netty中加入了内存池管理,看了netty后突然对这块很感兴趣,怎么办?最简单的方式无非看源码呗。我们顺着思路强行分析一波。分析下简单需求,为了能够简单的操作内存,必须保证每次分配到的内存时连续的。我们来看下netty的poolChunk。PoolChunk该类主要负责内存块的分配与回收,我们可以从源码中给的注释差不多看清PoolChunk的数据结构与算法。先介绍两个术语pag...
2018-05-20 19:06:17
998
原创 go中的sync.Mutex
golang中的互斥锁定义在src/sync/mutex.go源码中给出了互斥量公平的解释,差不多意思如下:互斥锁可以处于两种操作模式:normal和starvation。在normal模式下,新加入竞争锁队列的协程也会直接参与到锁的竞争中来,处于starvation模式下,所以新加入的协程将直接进入等待队列中挂起,直到其等待队列之前的协程全部执行完毕。normal模式下,协程的竞争等待时间如果大...
2018-05-20 02:04:59
1516
原创 go中的sync.Map
Go 1.9中的sync.Map提供了线程安全的map,它的优点总结如下:(网上找的)1.空间换时间。 通过冗余的两个数据结构(read、dirty),实现加锁对性能的影响。2.使用只读数据(read),避免读写冲突。3.动态调整,miss次数多了之后,将dirty数据提升为read。4.double-checking。5.延迟删除。 删除一个键值只是打标记,只有在提升dirty的时候才清理删除的...
2018-05-18 15:38:17
824
原创 Netty源码之客户端建立与连接
netty引导客户端启动类的代码如下EventLoopGroup group = new NioEventLoopGroup(); try {+ Bootstrap b = new Bootstrap(); b.group(group) .channel(NioSocketChannel.cla...
2018-05-17 22:36:44
1294
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人