【转载】系统怎样做到高可用?
高可用性(High Availability,HA)是你在系统设计时经常会听到的一个名词,它指的是系统具备较高的无故障运行的能力。通常来讲,一个高并发大流量的系统,系统出现故障比系统性能低更损伤用户的使用体验。想象一下,一个日活用户过百万的系统,一分钟的故障可能会影响到上千的用户。而且随着系统日活的增加,一分钟的故障时间影响到的用户数也随之增加,系统对于可用性的要求也会更高。所以今天,我们就...
高可用性(High Availability,HA)是你在系统设计时经常会听到的一个名词,它指的是系统具备较高的无故障运行的能力。通常来讲,一个高并发大流量的系统,系统出现故障比系统性能低更损伤用户的使用体验。想象一下,一个日活用户过百万的系统,一分钟的故障可能会影响到上千的用户。而且随着系统日活的增加,一分钟的故障时间影响到的用户数也随之增加,系统对于可用性的要求也会更高。所以今天,我们就...
原子性带来的并发安全问题在并发编程中,产生并发安全问题主要有三个源头,可见性,原子性,有序性可见性与有序性都可以使用volatile关键字解决,下面我们来分析下原子性带来的并发安全问题由于IO太慢,在早期的操作系统中就发明了多进程,操作系统允许某个进程执行一小段时间,例如过了50毫秒,过了50毫秒后,操作系统就会重新选择一个新的进程来执行(也就是“任务切换”),这个50毫秒也就是操作系统中的...
一、CountDownLatchCountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行。CountDownLatch是通过一个计数器来实现的,计数器的初始化值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已完成任务,然后在闭锁上等待的线程就可以恢复执行任务。现在有这样一个运动会场景,总共...
一、ConcurrentHashMap源码分析1.1 为什么要用ConcurrentHashMap在并发编程的情况下,使用HashMap可能会导致程序死循环,而使用线程安全的HashTable效率又十分低下,所以大名鼎鼎的Doug Lea写出了伟大的并发安全的ConcurrentHashMap!1.1.1 并发条件下使用HashMapHashMap在并发条件执行put操作会引起死循环,因为多...
高并发保护常用方案缓存:缓存的目的是提升系统访问速度和增大系统处理容量降级:降级是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行限流:限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理为什么需要限流在一个高并发系统中对流量的把控...
为什么要链接动态化,如何动态化为了避免F12或着抓包获取到秒杀链接然后通过不正当手段自动化秒杀,下面我们将接口路径进行动态生成,只有当点击秒杀按钮时才能成功验证。用户在下单前,先发出一个生成Md5 hash值的请求,根据抢购商品id和用户Id用Md5加密算法和随机盐生成一个hash值存到redis中,在redis中设置过期时间,等用户真正下单时发起的下单请求(秒杀请求)携带着Md5的hash...
为何需要异步下单在秒杀系统用户进行抢购的过程中,由于在同一时间会有大量请求涌入服务器,如果每个请求都立即访问数据库进行扣减库存+写入订单的操作,对数据库的压力是巨大的。如何减轻数据库的压力呢,我们将每一条秒杀的请求存入消息队列(例如RabbitMQ)中,放入消息队列后,给用户返回类似“抢购请求发送成功”的结果。而在消息队列中,我们将收到的下订单请求一个个的写入数据库中,比起多线程同步修改数据...
Redis缓存整合在高并发的环境下数据库成为系统的短板,所以引入缓存,作为数据库前的一道防线,避免所有的请求直接走数据库,降低数据库的压力,数据库层只承担“能力范围内”的访问请求。由于一个项目中有不同模块的功能,所以在Redis封装时需要创建一个业务前缀拼接在Key前面,便于区分各个模块。前缀接口:/** * Key的前缀接口 * 用来区分各个模块 */ public interfac...
分布式项目中要实现单点登录(SSO - Single Sign On):对于同一个客户端(例如 Chrome 浏览器),只要登录了一个子站(例如 a.com),则所有子站(b.com、c.com)都认为已经登录。比如用户在登录淘宝后,跳转到天猫时就已经登录了。通过redis缓存和cookie实现单点登录:登录接口逻辑处理: @ResponseBody @RequestMappi...