高并发
文章平均质量分 93
刘莅
黄沙百战穿金甲,不破楼兰终不还
展开
-
爱TA!就为TA搭建一个只属于你俩的IM系统
前一段时间笔者利用业余时间,基于Netty开发了一套基本功能比较完善的IM系统。该系统支持私聊、群聊、会话管理、心跳检测,支持服务注册、负载均衡,支持任意节点水平扩容。正好前一段,网上的一些读者,也希望笔者分享一些Netty或者IM相关的知识,所以今天笔者把开发的这套IM系统与大家分享,并讲述IM系统的基本原理。相信很多朋友对微信、QQ等聊天软件的实现原理都非常感兴趣,笔者同样对这些软件有着深厚的兴趣。另外笔者在公司也是做IM的,每天承载着上亿条消息的发送。github地址:https://g原创 2020-10-16 17:32:54 · 339 阅读 · 0 评论 -
Sentinel:流控规则
上一篇文章,我们一起探讨了Sentinel流量控制的简单用法,本小节,我们一起探讨Sentinel的三种流控规则。说到系统接口的限流,我们一般会想到用几种限流的算法,比如漏桶算法、令牌桶算法,在单机内,我们可以采用Guava中提供的API帮我们实现限流功能。而在分布式环境中,我们可以用Redis、MQ等中间件来实现限流的功能。然而,Sentinel为我们提供了更加灵活的限流规则和策略,同时也支持单机和集群模式,方便我们根据不同的应用场景,选择不同的流控、限流的规则。常用的有如...原创 2020-10-16 17:22:09 · 2754 阅读 · 1 评论 -
Sentinel:流量控制
Sentinel是什么?Sentinel是面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流、服务熔断、服务降级、系统保护等多个层面,保障分布式系统的稳定性。在阿里巴巴内部有一句口号:“稳定压倒一切”,稳定性是系统的基础能力,目前,Sentinel在阿里巴巴内部广泛被使用,为多年的双11、双12等大促活动保驾护航。Sentinel的主要特性:Sentinel由以下两个部分组成: 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时原创 2020-10-16 17:10:38 · 405 阅读 · 1 评论 -
Apache Dubbo系列:Dubbo技术汇总
最近编写了若干与Dubbo相关的技术博客,今天汇总发给大家Apache Dubbo系列:ZooKeeper注册中心Apache Dubbo系列:Netty与Dubbo是如何对接的Apache Dubbo系列:集群容错整体架构Apache Dubbo系列:Dubbo线程模型Apache Dubbo系列:Dubbo的线程池策略Apache Dubbo系列:全链路异步Apache Dubbo系列:泛化调用Apache Dubbo系列:增强SPI...原创 2020-10-16 17:05:14 · 248 阅读 · 0 评论 -
Apache Dubbo系列:全链路异步
Dubbo从2.7.0版本开始,升级了对java8的支持,以JUC包下的CompletableFuture为基础,支持所有异步编程接口,解决了2.7.0版本之前异步调用功能使用上的不方便。Dubbo异步调用也是基于NIO的非阻塞能力实现的,服务消费端不需要启动多个线程即可完成并行调用多个远程服务,其调用流程如下:Dubbo2.7.0之前的弊端在2.7.0之前,Dubbo的服务消费者异步调用服务提供者的的方式如下:public interface UserService { .原创 2020-10-16 17:02:37 · 640 阅读 · 0 评论 -
Apache Dubbo系列:泛化调用
上一章,我们讲到了Dubbo的线程池策略,本章我们一起探讨,Dubbo如何实现泛化调用的。主要内容包括:1、什么是泛化调用2、泛化调用的三种方式3、如何使用4、源码分析推荐阅读:Apache Dubbo系列:集群容错整体架构Apache Dubbo系列:Dubbo线程模型Apache Dubbo系列:Dubbo的线程池策略什么是泛化调用我们基于Dubbo API搭建Dubbo服务时,服务消费端需要依赖于一个SDK二方包,其中存放这服务提供端提供的所有接口。泛.原创 2020-10-16 16:52:53 · 1161 阅读 · 1 评论 -
Apache Dubbo系列:Dubbo的线程池策略
概述我们上篇文章讲到,Dubbo提供了多种线程模型,是为了尽早的释放I/O线程,把耗时的业务分派给业务线程池,那么这里的线程池是什么类型的线程池呢?是我们所熟知的JAVA线程池吗?并不是,这里的线程池,也是Dubbo的扩展接口ThreadPool。ThreadPoolDubbo为我们提供了四种类型的线程池,分别是1、FixedThreadPool(默认),固定线程数的线程池。2、LimitedThreadPool,线程池的线程数随着并发量动态增加,但不会超过配置的阈值。3、Eag.原创 2020-10-16 16:47:17 · 1993 阅读 · 0 评论 -
Apache Dubbo系列:Dubbo线程模型
导读我们都知道,Dubbo使用默认的网络传输框架是Netty,服务提供方NettyServer使用两个NIO线程池EventLoopGroup(boss)和EventLoopGroup(worker),前者负责接收客户端的连接,并分发给后者处理。我们把这两个线程组成为I/O线程(或Netty线程)。如果服务提供方能快速处理客户端的请求,那么直接在I/O线程(Netty线程)上处理比较合适。否则(如查DB、请求三方接口等),需要将客户端的请求,分派(Dispatcher)给业务线程池(Dubbo.原创 2020-10-16 16:40:51 · 482 阅读 · 0 评论 -
API接口限流
嗨,大家好!今天给大家分享一个高并发系统中必备的技能——限流。在正式开始之前我想问问大家,身为程序员的大家,在周一到周五早上上班进地铁站的时候,有没有见过类似这样的场景?同样,在互联网行业中,也存在这样得场景,我们把它称为——限流,为什么要限流呢,原因如下:在系统上线初期,用户量和访问量不大得时候,一般部署几台应用服务器,数据库做一个读写分离就基本上抗得住,但随着时间的推移,业务的发展,用户量和日活得增加,系统所承受的压力越来越大,我么都知道,应用服务器扩容很方便,但数据库扩容就有些麻.原创 2020-10-15 19:09:26 · 978 阅读 · 0 评论 -
Apache Dubbo系列:ZooKeeper注册中心
在Dubbo微服务体系中,注册中心是核心组件之一。Dubbo通过注册中心实现分布式环境中各个服务之间的注册和发现,是各个节点间的纽带。在微服务体系中,注册中心的作用如下: 服务动态加入。一个服务提供者可以通过注册中心动态的将自己暴露给各个服务消费方。 服务动态订阅。服务消费方可以通过注册中心,实时的感知新旧服务的上线与下线。 动态调整。注册中心支持参数的动态调整,新参数将自动更新到所有相关的节点中。 统一配置。提供统一的配置服务。 在Dubb...原创 2020-07-26 22:46:44 · 545 阅读 · 0 评论 -
Netty入门之TimeServer
嗨,大家好!!!最近,上级给我安排了个任务,要把系统中与websocket的的模块独立出来,并用Netty重写,哈哈,从毕业到现在一直做的都是业务方面的开发,这方面的工作还没怎么做过,很高兴的接了这个任务。下面就带大家初识JAVA界大名鼎鼎的Netty,从这篇文章中,大家可以学到的内容如下: 什么是Netty JDK中的I/O的缺点 为什么选择Netty ...原创 2019-03-24 16:56:37 · 2036 阅读 · 0 评论 -
从数据存储角度分析Redis性能为何如此高
胸藏文墨怀若谷,腹有诗书气自华前言Redis作为一种KV缓存服务器,有着极高的性能,相对于memcache,Redis支持更多中数据类型,因此在业界广泛应用。正文记得笔者刚毕业那会参加面试,面试官会问我Redis为什么快,由于当时技术水平有限,我只能回答出如下两点:数据是存储在内存中的。 Redis是单线程的。当然,将数据存储在内存中,读取的时候后不需要进行磁...原创 2019-01-30 13:19:04 · 4036 阅读 · 0 评论 -
Dubbo如何正确捕获业务异常
笔者所在的公司,项目正在重构,从一个SpringBoot项目往Dubbo上迁移,但在拆分后发现一个问题,服务消费者(后文用Consumer代替)无法正确捕获服务提供者(后文用provider代替)所抛出的非受检查异常。在未拆分之前,项目都是打成一个jar包运行,service层未处理的unchecked异常,在controller层捕获到后可以正常打印出异常的堆栈信息,方便开发人员快速定位...原创 2019-02-09 21:28:17 · 10904 阅读 · 3 评论 -
并发编程JUC包源码分析——从AtomicInteger到Unafe
AtomticInteger类我们都知道,在多线程环境中操作一个Integer类型的数据会产生数据不一致现象,比如i++操作,这是因为i++操作并不是一个原子操作,来看下面的例子:public class Main{ public static int i = 0; public static void main(String[] args) throws Excepti...原创 2018-11-22 17:20:37 · 7538 阅读 · 0 评论 -
Nginx性能调优,解决C10K问题
公司的技术总监最近出了一道架构方面的问题让我们同组的开发人员设计,题目是这样的:有个签到功能,需要记录每个⽤户每年每⼀天的签到情况。假设⽤户量在千万,甚⾄亿级,该如何设计。思考这个问题后,我给出的设计方案如下:第一层:通过DNS,同一个域名绑定多个IP,在DNS上进行负载均衡。第二层:中央Nginx集群,通过DNS负载均衡后,通过nginx二次负载均衡(Nginx的配置...原创 2018-09-10 20:06:07 · 10778 阅读 · 0 评论 -
Apache 开源的curator 基于Zookeeper实现分布式锁以及源码分析
前一段时间,我发表了一篇关于Redis实现分布式锁 分布式环境下利用Redis实现分布式锁,今天我带领大家熟悉用zookeeper实现分布式锁。在学习分布式锁之前,让我们想一想,在什么业务场景下会用到分布式锁以及设计分布式锁要注意什么?分布式锁介绍1、在什么业务场景中会使用到分布式锁当多个客户端访问服务器上同一个资源的时候,需要保证数据的一致性,比如秒杀系统,举个栗子:某件商品...原创 2018-08-25 20:38:50 · 7941 阅读 · 0 评论 -
RabbitMQ中的事务与confirmSelect模式
好久没写技术文章了,由于公司马上要做消息相关的业务,所以最近在Docker上搭了一台RabbitMQ并研究研究。从网易蜂巢上拉取的镜像:docker pull hub.c.163.com/library/rabbitmq:latest启动容器:docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672...原创 2018-08-06 19:34:58 · 13998 阅读 · 1 评论 -
老司机带大家领略MySQL中的乐观锁和悲观锁
为什么需要锁在并发环境下,如果多个客户端访问同一条数据,此时就会产生数据不一致的问题,如何解决,通过加锁的机制,常见的有两种锁,乐观锁和悲观锁,可以在一定程度上解决并发访问。乐观锁乐观锁,顾名思义,对加锁持有一种乐观的态度,即先进行业务操作,不到最后一步不进行加锁,"乐观"的认为加锁一定会成功的,在最后一步更新数据的时候在进行加锁,乐观锁的实现方式一般为每一条数据加一个版本号,具体流程是这样的: ...原创 2018-05-27 18:55:28 · 13373 阅读 · 3 评论