目录:
1、post为什么会发送两次请求?
A:那是因为浏览器的安全策略(同源策略)决定的;会进行一次预请求,第二次才会真正发送post请求。
预检请求中包含了一些额外的头部信息,如 Origin 和 Access-Control-Request-Method 等,用于告知服务器实际请求的方法和来源。服务器收到预检请求后,可以根据这些头部信息,进行验证和授权判断。如果服务器认可该跨域请求,将返回一个包含 Access-Control-Allow-Origin 等头部信息的响应,浏览器才会继续发送实际的跨域请求。
使用预检请求机制可以有效地防范跨域请求带来的安全风险,保护用户数据和隐私。
2、单核CPU支持多线程吗?
A:支持。
多任务系统往往需要同时执行多道作业。作业数往往大于机器的CPU数,然而一颗CPU同时只能执行一项任务,如何让用户感觉这些任务正在同时进行呢?
操作系统的设计者
巧妙地利用了时间片轮转的方式时间片是CPU分配给各个任务(线程)的时间,因为时间片非常短,所以CPU通过不停地切换线程执行。
3、ConcurrentHashMap 如何保证线程的安全性?
A:ConcurrentHashMap 是 HashMap 的线程安全版本,其内部和 HashMap 一样,也是采用了数组 + 链表 + 红黑树的方式来实现。
在 JDK1.7 版本中,ConcurrentHashMap 由数组 + Segment + 分段锁实现,其内部分为一个个段(Segment)数组,Segment 通过继承 ReentrantLock 来进行加锁,通过每次锁住一个 segment 来降低锁的粒度而且保证了每个 segment 内的操作的线程安全性,从而实现全局线程安全。
在 ConcurrentHashMap 中,采用了大量的分而治之的思想来降低锁的粒度,提升并发性能。其源码中大量使用了 cas 操作来保证安全性,而不是和 HashTable 一样,不论什么方法,直接简单粗暴的使用 synchronized关键字来实现
4、数据库出现死锁如何处理?


重点:第一条具体就是从操作的粒度可分为表级锁、行级锁和页级锁。
5、如何搭建10万QPS大流量、大并发优惠券系统?
- 根据需求做出技术选型
存储
由于券模板、券记录这些都是需要持久化的数据,同时还需要支持条件查询,所以我们选用通用的结构化存储 MySQL 作为存储中间件。
缓存
由于发券时需要券模板信息,大流量情况下,不可能每次都从 MySQL 获取券模 板信息,因此考虑引入缓存
同理,券的库存管理,或者叫库存扣减,也是一个高频、实时的操作,因此也考虑放入缓存中
主流的缓存 Redis 可以满足我们的需求,因此我们选用 Redis 作为缓存中间件。
消息队列
由于券模板/券记录都需要展示过期状态,并且根据不同的状态进行业务逻辑处理,因此有必要引入延迟消息队列来对券模板/券状态进行处理。RocketMQ 支持延时消息,因此我们选用 RocketMQ 作为消息队列。
系统框架
发券系统作为下游服务,是需要被上游服务所调用的。公司内部服务之间,采用的都是RPC 服务调用,系统开发语言使用的是 golang,因此我们使用 golang 服务的 RPC框架 kitex 进行代码编写。
我们采用 kitex+MySQL+Redis+RocketMQ 来实现发券系统,RPC 服务部署在公司的 docker 容器中。
1176

被折叠的 条评论
为什么被折叠?



