自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 rabbitmq集群、跨集群消息分发以及替代协议

集群介绍rabbitmq作为消息代理服务器,对于独立应用来说是简直完美,但是当应用程序需要高可用队列来满足额外的投递保证,或者将rabbitmq作为众多应用程序的消息总线时,rabbitmq内建的集群能力能够跨越多台服务器,提供强大的内聚环境缺点集群是按照低延迟环境进行设计,不推荐跨越WAN或者互联网来搭建集群(集群间的状态同步和跨节点的消息投递需要低延迟通信,只有LAN满足);集群的大小问题几维护集群共享状态的工作和开销与集群中节点数量的多少成正比,所以集群节点的上限在32到64个(集

2021-05-26 15:22:37 763

原创 rabbitmq消费消息以及消息路由

1. 如何消费消息?拉取(get)还是消费(consume)?首先看get如果没有消息,会返回空Basic.Get会导致每条消息都会与rabbitMq产生同步通信的开销,实际效率大约为Basic.Consume的二分之一,会影响消息的吞吐量,而且无法优化消息的投递过程再来看consume使用Basic.Consume消费消息意味着你的应用程序会在消息可用时自动从rabbbitmq接受消息,直到客户端发出Basic.Cancel为止,这是一个异步的操作。和get一样消费消息你的

2021-05-17 18:07:08 809

原创 rabbimq消息属性、消息发布性能权衡

1.rabbitmq是什么?轻量级,基于AMQP(高级消息队列模型)的一种跨平台/开源的消息中间件,可用于实时业务压力情境的解耦2.高级消息队列模型交换器(Exchange)、队列(Queue)、绑定(Binding)(其中交换器有3种模式,分别是direct,fanout,topic,也就是直连,广播,模式匹配)3.帧 命令所需的数据结构帧,用于对数据编码以便传输帧类型 主要费为五种类型:协议头帧(rabbitmq建立连接使用,只使用一次)、方法帧(携带发送给r...

2021-05-08 19:35:20 187

原创 缓存问题和数据一致性问题

缓存穿透 查询大量缓存中不存在乃至数据库中不存在的数据,导致大量调用数据库操作 解决方式: 缓存空对象:每查询一次不存在的数据,在redis内存中添加对应的键+空对象。 坏处:还是查了数据库;浪费redis大量的空间 布隆过滤器:程序启动时,把所有业务的需要用到的键缓存到redis中,当查询...

2021-04-19 18:33:47 105

原创 redis事务与发布订阅

redis字符编码 以类型string举例,当你存进来的是long类型,redis内部会适配int编码保存值。当你存的是其他数字类型或者字符串时用raw编码存储redis内部数据接口 字典: 内部是由2个哈希表加上几个记录属性构成,哈希表对应不同的table,每个table上的哈希值绑定一个链表。这个哈希表有扩展和伸缩的过程(都是rehash,扩展是创建一个2倍原长的哈希表,然后把原始的哈希表的数据放如新的哈希表)跳跃表: sortset内部的实...

2021-04-16 19:03:25 86

原创 高性能的mysql初探之七

mysql的备份(最好在从库或者专门的备份库备份,不要影响线上系统)物理备份:恢复快,简单,但是有时候文件可能是损坏的,不能跨平台逻辑备份:可以跨平台,mysql直接执行导出文件,但是逻辑备份导入很慢,因为要做些重建索引的操作,占用cpu时间长(使用mysqldump)文件备份:快照备份,速度快,恢复快,但是因为快照只会是块更改时做快照,当有一块的数据损坏时,是不会触发快照操作,造成之后的快照都是备份损坏的数据综合选择:物理备份加逻辑备份,逻辑备份做更新操作。如果有快照就更好备份恢...

2021-04-16 18:43:23 88

原创 redis的基础知识

redis常见的基本类型: 字符串,list,set,sortset,hashredis里面数据结构sds(字符串的实现,定义字符数组,等长扩展),双端链表(list的内部实现),字典(为每个key分配一个空间),压缩表,跳跃表redis常见异常缓存穿透:查询不存在的值(可以做程序过滤)缓存雪崩:大量的key同时过期(加时间的随机因子,热度大的因子,热度小的数据因子小)缓存预热:上线前的工作缓存降级:缓存失效或者缓存服务挂掉直接访问内存中的默认数据分布式锁...

2021-04-15 19:50:26 86

原创 高性能的mysql初探之六

如何做到一个好的查询?schema设计,索引设计,查询语句设计(走索引,limit语句尽量减少扫描的行,union语句优化,排序和分组走索引,没有索引就走关联查询的标识列,count的应用)还有可以通过一些高级特性如分区业务设计优化:垂直拆分(字段拆分,多次查询少关联),水平拆分(分库,分表),归档(增加写的压力,把不同状态的表记录写到不同的表中,减少表中没必要扫描的行)评估三大指标:响应时间,扫描的行,返回的行分区的好处: 太大的表无法走索引(查询在覆盖索引范围内除外)...

2021-04-15 11:26:31 96

原创 高性能的mysql初探之六

查询慢的原因 查询了不必要的记录;多表关联返回全部列;总是取出全部列(即select * 导致覆盖索引用不上),重复查询相同数据(缓存起来就行)衡量查询开销的三个指标 响应时间,扫描行数,返回的行数where使用的地方 在索引中使用where过滤,存储引擎层完成,速度很快;覆盖索引中过滤,在服务器层完成,其次;在数据表返回数据(引擎层返回所有数据,然后在服务层过滤),过滤不满足的条件,在服务层完成,最慢重构查询 复杂的查询可以拆分成多个简单的查询(简单的查询有...

2021-04-13 20:04:33 174

原创 高性能mysql初探之五

聚簇索引和二级索引(也就是辅助索引) 主键(自增的效率最高,不是自增可能会导致不是顺序插入引起页分裂,影响插入速度)默认是聚簇索引,存储是叶子节点不仅存储主键的key还存储对应行的所有列的值 二级索引键直接存储索引键的值(所以数字类型加索引,索引就会小得多),值直接存储主键的key,所以如果用到二级索引且查的值不在覆盖索引的范围内,就会再次去查一次聚簇索引拿到值索引的经验原则 选择度最高排最前原则,最左匹配原则,到范围位置原则(即涉及到范围的查询该列放最后,防止后面的列使用不到索引)...

2021-04-12 23:05:41 68

原创 高性能的mysql初探之四

schema与数据类型优化schema优化太多的列:mysql的服务层和存储引擎层通过行缓冲格式拷贝数据,然后在服务器将缓存内容解析成列。当列很多时,转换的代价逐渐增大太多的关联:关联虽然符合范式要求,但是会造成查询时间量增大和使索引失效值为null:值为null时,索引要做什么很多复杂和额外处理,需要额外的字节记录,索引统计也很麻烦而且可为null的列会使用更多的存储空间类型的优化整数型和字符类型,优先字符类型,字符类型在数据库要做很多额外的解析工作浮点型与精确类型(Dec..

2021-04-12 00:34:07 75

原创 高性能的mysql初探之三

如何发掘什么影响数据库性能的因素呢?一般都是通过监控数据,监控数据主要分为几大类:QPS(单位时间处理的sql的数量)与TPS(单位时间的事务量),并发量(并发量不代表连接量)与cpu使用率,磁盘IO,网卡流量针对这种监控数据可以做出不同的优化,比如优化效率底下的sql,检查什么操作造成了大量的并发是堆积还是用户量上来了,换更好的磁盘或者消耗磁盘性能的计划任务调整,减少从服务器的数量,分级缓存,避免使用select *,分离业务网络和服务器网络等。大表和大事务也会影响数据库性能大表:记.

2021-04-11 00:12:08 88

原创 高性能的mysql初探之二

如何衡量性能呢? 既不是吞吐量也不是使用的资源数,这些都是副产品,唯一的标准就是响应时间。响应时间由执行时间和等待时间构成。在做优化时,执行时间可以通过各种方法或者工具分析,但是等待时间就需要一些猜测和验证了测量的重要性 在各种数据库中都加了很多测量点,因为如果无法测量也就无法优化。测量最佳开始点是应用程序而不是数据库,即使问题出现在数据库,也可以通过良好的测量很容易地发现问题。 测量是不完全,不能穷举,也会出现问题,要尽量知道采用的测量方法的缺陷和优点剖析 捕捉mys...

2021-04-09 20:16:36 87

原创 高性能的mysql初探之一

高性能mysql mysql主要分为三层,最上层 做些客户端连接和安全认证的工作,中间一层是核心服务层有线程处理,缓存,解析器和优化器,最下层是存储引擎的实现在用到事务引擎的innoDb时的隔离级别时,总是很难分清读已提交和可重复读的区别,而读未提交(出现幻读)和序列化读(读就加锁,也就是单事务操作)很好区分,下面的图分别是可重复读和读已提交测试的过程可重复读:读已提交:实际读起来发现,左边窗口永远能读到右边窗口更改的数据。而读已提交 这种会出现不可重复读,A事务也就是在..

2021-04-07 20:08:56 78

原创 设计模式初探之四(完结篇)

职责链模式例子可以为请假审批,首先有个抽象时间类还有具体的实现,抽象职责处理器还有不同处理实现子类,每个子类含有一个上级的对象,当本对象无法处理调用上级对象处理,但是这种模式要注意什么人没处理的情况,就是要做好范围控制中介者模式 例子就是联合国,解决对象之间的强耦合,依赖其他对象才能完成操作的缺点。有个抽象对象和具体n个实现,每个实现类都带有中介类的引用,当实现类相互通信时,可以把信息发送到中介类对应引用的属性中,中介类抱有所有实现类的引用。这样虽然解决了对象强耦合的关系,但是把业务量转..

2021-04-06 20:12:46 71

原创 设计模式初探之三

状态模式 当一个对象的行为取决于状态并且运行时状态不断改变就需要考虑状态,状态模式的结构就是 工作类 包含状态的引用,有一个工作方法,而状态是抽象状态,有不同的状态类,也有一个状态行为方法,客户端new出工作类设入状态类,然后调用工作类的额工作方方法,工作方法再调用状态的状态行为适配器模式 一般用作对接接口或者项目维护的时候,譬如A类与B类要对接,但是发现接口的参数配不上,这是就需要用到适配器,结构为 被调用即暴露出去的的工作类,适配器继承工作类重写方法,内部包含一个要是适配的类的额引用...

2021-04-05 00:30:22 54

原创 设计模式初探之二

设计模式 原型设计模式:相当于简历辅助问题,可以用clone方法直接clone出一个对象,这只是浅层复制,对于对象里面的对象应用是没用的,还是同一个指针,要想clone出来的对象的里面的对象引用也分别是不同的话,你只能自定义实现clone方法new个对象了建造器模式 当我们想让制作出来的对象的流程能够标准化,不需要由客户端程序来控制的时候,因为客户端容易遗漏,这时候就需要建造器模式,结果分别抽象产品,抽象建造者,抽象指挥者,其中产品有各种不同产品的实现,建造者定义很多方法去加工抽象产品,而抽..

2021-04-04 00:07:18 70

原创 分布式事务与几种简单设计模式

TCC模式在分布式事务中需要一连串操作同时成功,同时失败,譬如订单服务,客户下了订单,订单要调用库存服务扣库存,调用积分服务加积分,调用出单服务出单,调用金库服务加钱,这些都有服务都要同时成功,那怎么办呢?业界提出了tcc模式这种提交,也就是分try-comfirm-cancel三步走,那么具体到业务怎么设计呢?譬如库存服务的表除了库存数量这个字段还要冻结库存字段,把在try阶段扣的库存放在这,库存字段照样减库存,这里冻结的库存是为失败回滚准备的,而积分服务同样加一个冻结字段,而订单服务的状态这时是一个

2021-04-02 20:00:53 192 2

原创 接口冥等与kafka和docker部署

如何实现接口的冥等性? 其实这个问题就是方式页面大量重复请求和重复提交的问题,这种问题可以根据接口调用规则,给相同时间一定时间的调用绑定一个唯一id,id可以放在header里面,比如支付订单时,不能让用户多次支付同一个订单,这是你就可以把订单id当成唯一的id了,在后台通过分布式锁的方案来加锁实现kafka的一些了解kafka相对与rabbitMq是采取分布式集群来部署的,比较适合处理高并发的业务,因为kafka对接的是流式对象,每条记录都是包含key,value和时间戳的,kafka里面是.

2021-04-01 20:05:58 101

原创 jvm的划分与微服务注册/追踪/监控

jvm发展历史:serial(单线程jvm)--cms(经典分代jvm)---G1(最新jvm,采用元空间,不再分代)jvm 现在主流用的是jdk8,所以还是需要了解分代的,jvm主要分为:方法区(也叫永久代),堆,虚拟机栈,本地方法栈,指令控制区其中 方法区 主要是存储类型的信息,常量定义与值,方法的定义,常量池等,堆主要就是存储对象的,虚拟机栈一般都是存储方法内局部变量,操作,动态链接等,本地方法栈就是存储本地方法的,如指令控制区就是存储指令的其中栈的寿命随着线程的生死而生死,就是出栈和入栈

2021-03-31 20:16:10 118

原创 分布式锁的几种实现

解决超卖问题的几种方式 用mysql实现,在mysql表中存储一张表专门记录加锁对象的id的记录,设置过期时间,当过期时间到了由mysql的计划任务自动删除记录,多个服务同时去请求锁会先访问数据库的这种表。这种方法缺点是mysql资源开销大,而且mysql一般都是集群部署,容易出现主从同步延迟问题,导致不同服务读取的结果不同 用redis实现,redis的java api设置分布式锁很简单,只是需要在设置分布式锁的逻辑加上watch dog逻辑也就是在加锁的逻辑中另起一个线程不断去判断当前设置的

2021-03-30 20:01:58 70

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除