RocketMQ使用
一、MQ介绍1、为什么要用MQ消息队列是一种“先进先出”的数据结构
其应用场景主要包含以下3个方面
应用解耦
系统的耦合性越高,容错性就越低。以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。
使用消息队列解耦合,系统的耦合性就会提高了。比如物流系统发生故障,需要几分钟才能来修复,在这段时间内,物流系统要处理的数据被缓存到消息队列中,用户的下单操作正常完成。当物流系统回复后,补充处理存在消息队列中的订单消息即可,终端系统感知不到物流系统发生过几分钟故障。
流量削峰
应用系统如果遇到系统请求流量的瞬间猛增,有可能会将系统压垮。有了消息队列可以将大量请求缓存起来,分散到很长一段时间处理,这样可以大大提到系统的稳定性和用户体验。
一般情况,为了保证系统的稳定性,如果系统负载超过阈值,就会阻止用户请求,这会影响用户体验,而如果使用消息队列将请求缓存起来,等待系统处理完毕后通知用户下单完毕,这样总不能下单体验要好。
处于经济考量目的:
业务系统正常时段的QPS如果 ...
微服务概述
单体架构、SOA和微服务1、单体架构比如要做一个简单的商城系统,基本的功能模块有用户模块、商品模块、商家模块、后台管理。单体架构就是把这些功能实现逻辑全部放在一个项目里,打包发布的时候以一个jar包或 war 包发布。其部署很简单,不过随着业务量激增或网站流量的增加。必然桑露其致命缺陷。
2、SOASOA (Service Oriented Architecture,面向服务的体系结构)旨在提升代码复用性及可扩展性,降低耦合等。比如点外卖的流程,点了外卖之后要分配送餐员,分配送餐员可以是一个服务;还有可能要发短信通知,短信通知也可以形成一个服务。这些服务可独立部署运行,服务之间可以通过网络调用(HTTP 等方式)。这样服务组合起来便形成一个完整的系统。
3、微服务“微服务” 是世界级软件开发大师马丁 •福勒( Martin Fowler)和James Lewis 共同提出的。其定义微服务是由多个功能单一的小服务组成的,服务可以依据业务功能设计拆分;这些服务独立部署;不同服务可以使用不同的技术实现(指不同的编程语言与数据库等);服务与服务之间采用 HTTP 等轻量协议传输数据,服务之间独 ...
InnoDB中的MVCC
一、背景1、概述MVCC全称Multi-Version Concurrency Control 多版本并发控制,MVCC 是一种并发控制的方法,一般用在数据库管理系统中,实现对数据库的并发访问,解决并发事务带来的问题。它最大的优点是读不加锁,因此读写不冲突,并发性能好。InnoDB实现MVCC,多个版本的数据可以共存。
2、为什么使用MVCC最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞。引入MVCC之后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提高了InnoDB的并发度。
InnoDB默认的隔离级别是RR(REPEATABLE READ),RR解决脏读、不可重复读、幻读等问题,使用的是MVCC。
在内部实现中,InnoDB是在undolog中实现的,通过undolog可以找回数据的历史版本。找回的数据历史版本可以提供给用户读(按照隔离级别的定义,有些读请求只能看到比较老的数据版本),也可以在回滚的时候覆盖数据页上的数据。在InnoDB内部中,会记录一个全局的活跃读写事务数组,其主要用来判断事务的可见性。
3、事务隔离级别SQL 标准定义了四种隔离级别 ...
Java反射
概述Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。)语言的一个关键性质。
Java程序中的对象在运行时可以表现为两种类型,即编译时类型和运行时类型。例如 Person p = new Student(); ,这行代码将会生成一个p变量,该变量的编译时类型为Person,运行时类型为Student。
有时,程序在运行时接收到外部传入的一个对象,该对象的编译时类型是Object,但程序又需要调用该对象的运行时类型的方法。这就要求程序需要在运行时发现对象和类的真实信息,而解决这个问题有以下两种做法:
第一种做法是假设在编译时和运行时都完全知道类型的具体信息,在这种情况下,可以先使用instanceof运算符进行判断,再利用强制类型转换将其转换成 ...
BTC-分叉
区块链由一条链变为两条链就叫分叉。分叉可能是多种原因造成的,比如挖矿的时候,两个节点差不多同一个时候挖到了矿,就会出现一个临时性的分叉,我们把这个分叉叫作state fork,是由于对比特币区块链当前的状态有意见分歧而导致的分叉。
前面还讲过分叉攻击(forking attack),它也属于state fork,也是属于对比特币这个区块链当前的状态产生的意见分歧,只不过这个意见分歧是故意造成的,人为造成的,所以我们又叫它deliberate fork。
除了这种state fork 之外,还有一种产生分叉的情况是,比特币的协议发生了改变,要修改比特币系统需要软件升级。在一个去中心化的系统里,升级软件的时候没有办法保证所有的节点同时都升级软件。
假设大部分节点升级了软件,少数节点因为种种原因可能没有升级,有可能是还没来得及升级,也可能是不同意对这个协议的修改。即假如你想把协议改成某个样子社区中可能是有人不支持的,这个时候也会出现分叉,这种分叉叫protocol fork(协议分叉)。因为对比特币协议产生了分歧,用不同版本的协议造成的分叉,我们称作protocol fork。
根据对协议修 ...
JDK1.8中的HashMap源码分析
一、关于HashMapHashMap是最经典的Map实现,HashMap是一个具有映射关系(key-value)的集合,它基于hash算法,通过put和get方式存储和获取对象。
二、HashMap实现原理1、数据结构HashMap的底层维护一个Node数组Node<K,V>[] table,哈希bucket就是HashMap数组里面的一个位置中所占所有数据,每个bucket里面通过Node<K,V>来储存元素,Node实现了Entry,Node还可以扩展成链表,当链表长度大于等于8时,会转化为红黑树TreeNode<K,V>。
2、原理存储对象时,我们将K/V传给put方法时,它调用K的hashCode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前bucket的占用情况自动调整容量(超过Load Facotr则resize为原来的2倍)。获取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,并进一步调用equals()方法确定键值对。
如果发生碰撞的时候,HashMap ...
在Spring中使用策略模式
策略模式问题:虽然使用策略模式能很好的解决这个问题,通过将不同的云存储的sdk封装为各自的工具类,都去实现同一个接口,让我们在使用文件上传的时候无需关注到底是通过哪个云存储去上传。也很方便的增加或者减少各种工具类。但是在Spring如何去判断和导入各种不同平台的文件上传工具类呢?
我们定义了这么多策略,应该怎么优雅的组织起来呢,这就需要用到Spring提供的一些扩展特性了,Spring主要为我们提供了三类扩展点,分别对应不同Bean生命周期阶段:
Aware接口
BeanPostProcessor
InitializingBean 和 init-method
具体实现1、编写文件上传的接口12345public interface FileUploadService { void upload(String bucketName, String fileName, InputStream stream);}
2、添加不同的云存储sdk工具类,都实现该接口123456789101112131415161718192021222324252627282 ...
索引
一、概念索引是一个单独的、存储在磁盘上的数据库结构,包含着对数据表里所有记录的引用指针。使用索引可以快速找出在某个或多个列中有一特定值的行,所有MySQL列类型都可以被索引,对相关列使用索引是提高查询操作速度的最佳途径。
索引是在存储引擎中实现的,因此,每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型。MySQL中索引的存储类型有两种,即BTREE和HASH,具体和表的存储引擎相关。MyISAM和InnoDB存储引擎只支持BTREE索引;MEMORY/HEAP存储引擎可以支持HASH和BTREE索引。
索引的优点:
通过创建唯一索引,可以保证数据库表中每一行数据的唯一性。
可以大大加快数据的查询速度,这也是创建索引的主要原因。
在实现数据的参考完整性方面,可以加速表和表之间的连接。
在使用分组和排序子句进行数据查询时,也可以显著减少查询中分组和排序的时间。
索引的缺点:
创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
索引需要占磁盘空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果有大量的索引,索引 ...
数据库优化
1、数据库优化MySQL数据库优化是多方面的,原则是减少系统的瓶颈,减少资源的占用,增加系统的反应速度。例如,通过优化文件系统,提高磁盘I\O的读写速度;通过优化操作系统调度策略,提高MySQL在高负荷情况下的负载能力;优化表结构、索引、查询语句等使查询响应更快。
针对查询,我们可以通过使用索引、使用连接代替子查询的方式来提高查询速度。
针对慢查询,我们可以通过分析慢查询日志,来发现引起慢查询的原因,从而有针对性的进行优化。
针对插入,我们可以通过禁用索引、禁用检查等方式来提高插入速度,在插入之后再启用索引和检查。
针对数据库结构,我们可以通过将字段很多的表拆分成多张表、增加中间表、增加冗余字段等方式进行优化。
2、该如何优化MySQL的查询?使用索引:如果查询时没有使用索引,查询语句将扫描表中的所有记录。在数据量大的情况下,这样查询的速度会很慢。如果使用索引进行查询,查询语句可以根据索引快速定位到待查询记录,从而减少查询的记录数,达到提高查询速度的目的。
索引可以提高查询的速度,但并不是使用带有索引的字段查询时索引都会起作用。有几种特殊情况,在这些情况下有可能使用带有索引的字段查 ...
事务
一、概述1、定义事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成。在事务中的操作,要么都执行修改,要么都不执行,这就是事务的目的,也是事务模型区别于文件系统的重要特征之一。
2、事务的ACID原则
Atomicity原子性
原子性指整个数据库事务是不可分割的工作单位。只有使事务中所有的数据库操作都执行成功,整个事务的执行才算成功。事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,数据库状态应该退回到执行事务前的状态。
Consistency一致性
一致性指事务将数据库从一种状态转变为另 ...