1 Star 0 Fork 7

雷恒/exercise

forked from 高鹏/exercise 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
紫霞神功 9.63 KB
一键复制 编辑 原始数据 按行查看 历史
高鹏 提交于 2020-05-13 17:57 . update 紫霞神功.
1. 什么是MQ? MQ的优点是什么?
MQ是消息队列,是软件和软件进行通信的中间件产品。
MQ的优点:解耦、异步、削峰
2. MQ中,应用解耦、异步、削峰是什么意思?
3. 消息队列都有什么优缺点?
优点:解耦、异步、削峰
缺点:
a. 系统可用性降低,系统引入的外部依赖越多,越容易挂掉。MQ 一挂,整套系统崩溃。
b. 系统复杂度提高,加入了消息队列,要多考虑很多方面的问题,比如:一致性问题、
如何保证消息不被重复消费、如何保证可靠性传输等。因此,需要考虑的问题更多,
复杂性增大。
c. 一致性问题,A系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题
是,要是BCD三个系统那里,BD两个系统写库成功了,结果C系统写库失败了,咋整?你这数据
就不一致了。
4. rabbitmq会不会出现消息重复被消费的情况?
会,如果消费者接收到消息,并且处理了消息,但是在确认之前断开了连接或取消了订阅,rabbitmq就会认为消息没有被分发,
然后重新分发给另一个订阅的消费者。此时就会出现重复消费同一个消息的情况。
也有可能,生产者将同一个消息投递了多次。
5. 那你如何避免消息重复消费的情况?
保证消息不被重复消费的关键是保证消息队列的幂等性,这个问题针对业务场景来答分以下几点:
1.比如,你拿到这个消息做数据库的insert操作。那就容易了,给这个消息做一个唯一主键,
那么就算出现重复消费的情况,就会导致主键冲突,避免数据库出现脏数据。
2.再比如,你拿到这个消息做redis的set的操作,那就容易了,不用解决,
因为你无论set几次结果都是一样的,set操作本来就算幂等操作。
3.如果上面两种情况还不行,上大招。准备一个第三方介质,来做消费记录。以redis为例,给消息分配一个全局id,
只要消费过该消息,将<id,message>以K-V形式写入redis。那消费者开始消费前,先去redis中查询有没消费记录即可。
也可以使用 setnx 命令(注意redis的该命令是原子性的,因为redis是单线程模型)。在接收到消息后将消息ID作为key
执行 setnx 命令,如果执行成功就表示没有处理过这条消息,可以进行消费了,执行失败表示消息已经被消费了。
6. rabbitmq会不会出现丢失数据的问题?
会!
1. 生产者弄丢了数据。生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题啥的,都有可能。
2. RabbitMQ 弄丢了数据。MQ自己挂了,其中的消息也就丢失了。
3. 在自动确认消息模式下,消费端接收到了数据。还没来得及处理,结果进程挂了,比如重启了。
7. rabbitmq如何解决丢数据的问题?
1. 针对于生产者丢失
a. 开启RabbitMQ事务(同步,不推荐)
b. 开启confirm模式(异步,推荐)
2. 针对于RabbitMQ自身丢失数据,开启持久化功能,要让队列和队列中的消息都是持久化的。
3. 针对于消费方丢失数据,只要关闭自动ACK,使用手动ACK即可。
8. rabbitmq客户端消费一个消息时,出现异常了怎么办?
默认情况下,如果消费者程序出现异常情况, Rabbitmq 会自动实现补偿机制 也就是重试机制
@RabbitListener底层使用AOP进行拦截,如果程序没有抛出异常,自动提交事务。 如果Aop使用
异常通知拦截获取异常信息的话 , 自动实现补偿机制,该消息会一直缓存在Rabbitmq服务器端进
行重放,一直重试到不抛出异常为准。
一般来说默认5s重试一次,可以修改重试策略,消费者配置:
listener:
simple:
retry:
####开启消费者重试
enabled: true
####最大重试次数(默认无数次)
max-attempts: 5
####重试间隔次数
initial-interval: 3000
重试5次,不行就放弃,或者把该消息存入一个专门存放消费失败的消息的队列中。或者其他...
9. rabbitmq如何实现延迟队列?
消息ttl + 死信队列 + 消费者消费死信队列
10. RabbitMQ如何保证不丢数据?(Rabbitmq如何保证消息的可靠性?)
11. rabbitmq如何保证消息的顺序性?
保证某一个队列,就只有一个消费者即可。
同一组的任务会被分配到同一个队列里,每个队列只能有一个worker来消费,这样避免了同一个队列多个消费者消费时,乱序的可能!
12. 业务逻辑先更新数据库,然后把结果投递到消息队列 RocketMQ 中。如果业务逻辑更新完成,但是消息投递失败,这种情况应该怎么处理?
13. RabbitMQ如何解决分布式事务?
14. 什么是缓存雪崩 | 缓存击穿 | 缓存穿透? 以及如何处理?
15. redis的持久化了解吗?(redis中,rdb和aof持久化的区别)
16. redis中的数据结构有哪些?
17. redis哨兵模式是什么?
18. 能谈谈你对redis集群的理解吗?
19. redis是单线程的,为什么速度还那么快?
20. redis是如何筛选出热点数据的?
21. Redis集群方案应该怎么做?都有哪些方案?
22. 为什么Redis的操作是原子性的,怎么保证原子性的?
23. 谈谈你对Redis事务的理解?
24. Redis实现分布式锁是如何实现的?
25. redis的过期策略以及内存淘汰机制分别是什么?
26. 你在项目中是如何使用redis的?
27. 谈谈你对事务的理解?
28. 谈谈你对sql优化的理解?
29. 关于HashMap你知道多少?
30. 为什么HashMap的容量参数总是2的次幂?
31. GC回收算法有哪些?
32. 什么是分布式事务,有哪些解决方案?
33. 分布式系统中,如何处理会话?
34. 分布式系统中,是如何实现单点登录的?
35. CSRF攻击是什么? XXS攻击是什么?
36. 什么是sql注入漏洞,如何防止sql注入?
37. jdk1.7中的HashMap,在多线程环境下,会有什么问题?
38. SpringBoot自动配置的原理是什么?
39. 你是如何理解线程安全的?
40. ArayList和LinkedList的区别?
41. Spring框架中用到了哪些设计模式?
42. Spring ioc容器中的bean都是单例的,那如何保证线程安全问题?
43. 你在Controller中会定义全局变量吗? 为什么?
44. struts2和SpringMVC的区别?
45. Spring中bean的生命周期?
46. Spring中,如何注入一个java集合?
47. Spring中,bean的作用域有哪些?
48. Spring中,什么是bean的自动装配?
49. 说一下Spring中的事务传播行为?
50. JDK动态代理和CGLIB的区别?
51. CGlib比JDK快吗?
1)使用CGLib实现动态代理,CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,
在jdk6之前比使用Java反射效率要高。唯一需要注意的是,CGLib不能对声明为final的方法进行代理,
因为CGLib原理是动态生成被代理类的子类。
2)在jdk6、jdk7、jdk8逐步对JDK动态代理优化之后,在调用次数较少的情况下,JDK代理效率高于CGLIB代理效率,
只有当进行大量调用的时候,jdk6和jdk7比CGLIB代理效率低一点,但是到jdk8的时候,jdk代理效率高于CGLIB代理,
总之,每一次jdk版本升级,jdk代理效率都得到提升,而CGLIB代理消息确有点跟不上步伐。
52. Spring AOP 和 AspectJ AOP 有什么区别?
53. 解释一下Spring AOP里面的几个名词? 比如:切点,切面,连接点 织入...
54. Spring通知有哪些类型?
55. Spring如何选择用JDK还是CGLIB?
1)当Bean实现接口时,Spring就会用JDK的动态代理。
2)当Bean没有实现接口时,Spring使用CGlib是实现。
3)可以强制使用CGlib(在spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>)。
56. 程序设计原则你知道多少?
57. 你认为最常见的设计模式是什么? 在哪里见到过或用过?
58. hibernate和mybatis的区别是什么?
59. mybatis中#{}和${}的区别是什么?
60. Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?
61. 最佳实践中,通常一个Xml映射文件,都会写一个Dao接口与之对应,
请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
62. 你是如何理解分布式的?
分布式是为了解决传统单体服务架构带来的各种问题的,
比如,代码数量庞大,修改某一个模块的功能,就要重新部署整个项目。
分布式的优点:
a:把模块拆分,使用接口通信,降低模块之间的耦合度.
  b:把项目拆分成若干个子项目,不同的团队负责不同的子项目.
  c:增加功能时只需要再增加一个子项目,调用其他系统的接口就可以。
  d:可以灵活的进行分布式部署.  
  e:提高代码的复用性,比如service层,如果不采用分布式rest服务方式架构就会在手机wap商城,微信商城,pc,android,ios
每个端都要写一个service层逻辑,开发量大,难以维护一起升级,这时候就可以采用分布式rest服务方式,公用一个service层。
  分布式的缺点:
a:系统之间的交互要使用远程通信,接口开发增大工作量
b:CAP无法同时满足
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/lei-heng/exercise.git
git@gitee.com:lei-heng/exercise.git
lei-heng
exercise
exercise
master

搜索帮助

0d507c66 1850385 C8b1a773 1850385