架构
weixin_43887958
这个作者很懒,什么都没留下…
展开
-
RocketMQ重试和死信队列
消息消费失败后,消息会进入到 RocketMQ 的重试队列中。比如说消费者所属的消息组名称为AAAConsumerGroup其重试队列名称就叫做%RETRY%AAAConsumerGroup重试队列中的消息过一段时间会再次发送给消费者,如果还是无法正常执行会再次进入重试队列默认重试16次,还是无法执行,消息就会从重试队列进入到死信队列重试队列中的消息重试16次任然无法执行,将会进入到死信队列死信队列的名字是 %DLQ%AAAConsumerGroup处理死信队列中的消息先要修改权限为可读写(默原创 2021-08-06 09:28:20 · 468 阅读 · 0 评论 -
redis分布式锁的思考
关于redis主节点宕机,导致分布式锁失效的思考:线程1先创建一个uuid,获取到key为A的锁,value为线程1创建的uuid,过期时间为3秒,再创建一个watchdog线程每隔一秒就去重置过期时间,在线程1执行完毕后去释放该锁。可能遇到的情况:当前jvm进行gc,stw导致所有的线程都无法进行正常工作,如果时间过长,导致锁过期了,那么就需要在释放锁的时候去判断当前锁是否存在,不存在的话就抛出异常,若存在且是别的线程拿到的锁,也要抛出异常。另一种极端的情况:若是redis主从集群,那么有可能在异步复原创 2021-06-29 15:16:25 · 124 阅读 · 0 评论 -
同步复制和异步刷盘
大多数中间件要保证数据不丢失的话可以采用同步复制和异步刷盘,因为刷盘的话消耗较大.原创 2021-06-28 16:39:09 · 128 阅读 · 0 评论 -
bitmap以及布隆过滤器
bitmap直接使用会占用固定大小内存,建议使用org.roaringbitmap.RoaringBitmap这个实现类.布隆过滤器就是对同一个对象使用多个不同的hash函数,产生多个hash值,将这些hash值所在位置置为1,也就是bitmap[hash] = 1.将10亿个黑名单ip进行hash放入bitmap,hash值肯定会重复.这时有一个正常ip,经过这些hash函数产生了不同的hash值,如果这些值所在的位置都是1,那么就会误判成为在黑名单中;只要有一个bitmap[hash]=0,那么就原创 2021-04-29 18:07:03 · 257 阅读 · 0 评论 -
redis防止击穿
如果是分布式项目就用redis创建一个分布式锁(不是分布式就用jdk自带的锁):pubic Object query(QueryParam params){ Object result = null; String lockKey = "lock:" + JSON.toJSONString(params); result = redis.get(JSON.toJSONString(params)); if(result == null){ redis.lock(lockKey) try{原创 2021-04-29 17:52:29 · 75 阅读 · 0 评论 -
token刷新
private static final Logger logger = LoggerFactory.getLogger(LoginTools.class); /** * 用户token,eg. token:1245637858 */ private final static String TOKEN_KEY = "token:%s"; /** * 在多长时间内用户不用再次登录,比如3月1日登录了,expires为7天,那么用户 * 在3月8日原创 2021-04-15 20:51:01 · 140 阅读 · 0 评论 -
秒杀系统的个人理解
1.所有的静态页面不要和秒杀服务器放在一起,最好是放在cdn服务器上,减少流量的压力.2.将要被秒杀的商品相关信息放入redis缓存中,比如数量等.3.用户抢购时,直接使用decrease减少数量,减少到0就不再减少,减少请求成功的用户就相当于抢购成功,减少请求失败的用户就直接返回.一般情况下,商品抢购的数量不会很多,差不多也就几百几千几万,如果就是几百或者几千,可以直接让抢购成功的用户下单入库,不用经过消息队列消除峰值,几百几千的tps数据库还是能顶住的.4.如果是几千上万的并发量,那么mysql就原创 2021-03-30 14:01:40 · 46 阅读 · 0 评论