项目常用中间件使用(mq、缓存、搜索引擎使用简述)

各中间件的使用

  • 背景介绍
  • 消息中间件 mq
  • 缓存 redis
  • 搜索引擎 Elasticsearch

背景介绍

ps: 总结一下在项目中使用的中间件内容,并且梳理一下在各中间件在写过的项目中的应用内容。

消息中间件 mq

介绍
消息中间件及消息队列,消息队列可以理解为一个存放消息的容器(Queue),先进先出的数据结构,在分布式系统中,消息中间件是不可少的重要内容,通常用来做异步处理同提高系统性能。比如削峰、解耦。常用的框架有RocketMq、RabbitMq、Kafka等。两种模型:点对点、发布订阅。

使用场景:
(1). 系统解耦(使用事件驱动模式解决模块之间的紧依赖性,提高系统扩展性)
(2). 削峰、异步 (主要用来减少响应时间,以前老大说一个接口超过500ms算很慢了)
应用:订单增加会员积分、订单触发某个活动、数据同步之类的我都用mq做。

注意事项:
(1). 接口幂等性,即防止消息重复消费,在分布式系统中,往往很难保证事务性,那么就要在接口保证幂等性,防止重复处理某一个事件。一个消息即使消费多次,也要确保对应的数据是不能出错的。
ps:其它的消息持久落地、高可用、顺序性等都依靠中间件就行了。
这里其实有一个问题,如果一个消息堆积起来几百万条,那该怎么办呢?读者可以想一想该怎么办哦。

缓存 redis

介绍
缓存就是将热点数据copy一份,放在某个本地或者外部内存中,进行快速响应以及减少db压力的好东东。常用缓存的中间件有redis、memcached,但是我只用过redis。

使用场景:
(1). 高性能、热点数据(缓存快呀,真的快呀,比扫硬盘快了多少多少倍呀)
(2). 高并发 (msyql单机Qps与redisQps没法比呀)
redis使用:
string:kv缓存
hash: map缓存
list:有序列表、消息队列、高性能分页
set:去重、交集、并集、差集
sorted set:去重排序

注意事项:
(1).缓存key模块化:要按照模块、功能进行key的设计,要有规范,方便管理。
(2).双写不一致:缓存和数据库由于某些原因导致内容不一致了。我通常读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。更新的时候,先更新数据库,然后再删除缓存。(当然有些场景也是跟新的)
(3).缓存雪崩:缓存挂了或者缓存没了,导致大量请求压在数据库,数据库也挂了,重启就挂。怎么解决呢,1.依赖redis高可用避免redis奔溃;2.key的过期时间不能集中;3.服务降级;4.服务层限流;5.二级缓存;总之不能让整个服务挂掉,即使只能支持百分之50的请求也比挂了好。
(4).缓存穿透:大量缓存查不到的内容,去请求数据库。缓存空值可以解决这个问题,其余的还是同上提高系统的高可用性。
(5).缓存击穿:某个非常热点的首页数据,过期期间,突然大并发击穿缓存,压在数据库上。1.key永不过期;2.分布式锁限制并发等待缓存成功;3.同上上依赖系统可用性。
(6).缓存的并发竞争:比如多客户端同时写入一个key,肯定是后写的成为了最终数据,就有可能出现错误。可以基于分布式锁限制访问、或者呢利用版本控制。
(7).redis单线程:不要在redis存储数据量大的内容,会影响使用缓存的响应速度。

搜索引擎 Elasticsearch

介绍:
ES基于lucene,倒序索引,每一个文档拥有一个id,将文档进行分词得到多个关键词,那么倒序索引就是关键词到id的映射索引。可以通过关键词索引到id,得到整个文档。
结构:
index->type->document->mapping->field(mapping、type在7.x已经移除),一个index会存在多个shard上,支持横向扩展,提高吞吐量和性能。这里有一个伏笔就是下面的分页查询。
使用场景:
(1). 搜索

注意事项:
(1). 数据量很大时查询很慢,有的时候你做查询很慢,这里和mysql是一样的,mysql做查询的时候,是将数据从硬盘中的整页内容加载到内存中给你的呢,es也要将硬盘中的数据加载到filesystem给你,所以内存要大,es中存储的数据最好都是搜索要用或者一些关键字段,内存和数据成1:1最好了。
1.存储数据为关键查询数据,其它数据存储在其它db中;
2.数据预热,系统定时将热点数据先请求一遍让它加载到内存中;
3.冷热分离,就是将热点数据和冷数据分index存储,避免被冲刷。
(2).不要在es中做关联查询
(3).分页查询:当你做分页查询时,越到后面越慢,是因为当你查第1000页时,每一个分片都需要按你的筛选查询1000页数据,然后在主node中做排序,也就是对1000页n条m分片进行排序。
1.不允许深度分页
2.做下拉加载,不允许直接跳转,使用es的scroll,对数据生成一个快照,然后游标移动。

**ps:**待续。。。。如果您有任何问题,请留言,个人技术不到位,所以写的东西存在很多问题,记录一下自己的思路。如果有不足还请多指点,十分感激。我会及时补充和修改、回复。

你可能感兴趣的:(中间件,redis,中间件,搜索引擎,elasticsearch,redis,mq)