1.不同服务之间的事务怎么处理
事务补偿机制:Service服务本身无状态,事务链中的任何一个正向事务操作,都必须存在一个完全符合回滚规则的可逆事务。如果是一个完整的事务链,则必须事务链中的每一个业务服务或操作都有对应的可逆服务。考虑实现一个通用的事务管理器,实现事务链和事务上下文的管理。对于事务链上的任何一个服务正向和逆向操作均在事务管理和协同器上注册,由事务管理器接管所有的事务补偿和回滚操作。
基于消息的最终一致性:关键就是异步消息和消息持久化机制。
等幂操作:所有提供的业务服务,不管是正向还是逆向的业务服务,都必须要支持重试。因为服务调用失败这种异常必须考虑到,不能因为服务的多次调用而导致业务数据的累计增加或减少。
是否可以补偿:看实际场景,客户是否可接受等。
比如你数据库操作完成了,MQ连接不上怎么办?我们可以在操作数据库的事务中,增加一个插入事件数据的任务,这个任务和主业务是同一个事务,保证一致性。另外起一个定时任务,从数据库读取插入的事件数据,转化成消息发布到消息队列,发布成功后删除事件数据。
2.mq消息生产者生产速度远远大于消费速度的时候怎么做?
缓存,降级,限流等。
缓存用于提升系统访问速度和增大系统处理能力;降级一般当服务出现问题或者影响到核心流程的性能,需要暂时屏蔽掉一些功能,待高峰过去或问题解决后再重新打开。而对于稀缺资源的访问,频繁调用复杂查询等需要大量计算资源的请求等,需要一种手段来限制这些场景下的并发量或请求量,此时需要使用的手段就是限流。
限流的目的是通过对并发访问、请求进行限速或者限制在一个时间窗口内的请求数量来保护系统。一旦达到限流上限,可以拒绝服务,也可以采取将请求放入缓存队列等待等手段进行处理。
一般高并发系统常见的限流有:限制并发总数(数据库连接池,线程池)、限制瞬间并发数、显示时间窗口内的平均速率,以及限制远程接口调用速率,限制MQ消费速度等。限流的使用需要做好评估,否则有可能出现一些奇怪的问题,或者造成不好的用户体验。
链接:https://www.jianshu.com/p/41781605ed29
限制接口访问频率、缓存队列、增加实例的数量提高消费的并行数、批量方式消费 、优化消费者代码
批量方式消费:置Consumer的consumerMessageBathMaxSize这个参数,默认是1,一次只消费一条消息
3.dubbo多服务负载均衡
4.几个MQ区别、kafka
ss
5.mq消息有丢失与重复消费问题
6.分布式架构吗?有用分布式事务
https://www.cnblogs.com/hafiz/p/9222973.html
7.zk选举机制
https://blog.csdn.net/liuj2511981/article/details/42460069
https://www.cnblogs.com/ASPNET2008/p/6421571.html
8.逃逸技术、内存逃逸
https://www.jianshu.com/p/7418a4451974
逃逸分析是目前Java虚拟机中比较前沿的优化技术,它并不是直接优化代码的手段,而是为其他优化手段提供依据的分析技术。
逃逸分析的主要作用就是分析对象作用域。
当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他方法中,这种行为就叫做 方法逃逸。甚至该对象还可能被外部线程访问到,例如赋值被类变量或可以在其他线程中访问的实例变量,称为 线程逃逸。
通过逃逸分析技术可以判断一个对象不会逃逸到方法或者线程之外。根据这一特点,就可以让这个对象在栈上分配内存,对象所占用的内存空间就可以随帧栈出栈而销毁。在一般应用中,不会逃逸的局部对象所占比例很大,如果能使用栈上分配,那么大量的对象就会随着方法的结束而自动销毁了,垃圾收集系统的压力就会小很多。
除此之外,逃逸分析的作用还包括 标量替换 和 同步消除 ;
标量替换 指:若一个对象被证明不会被外部访问,并且这个对象可以被拆解成若干个基本类型的形式,那么当程序真正执行的时候可以不创建这个对象,而是采用直接创建它的若干个被这个方法所使用到的成员变量来代替,将对象拆分后,除了可以让对象的成员变量在栈上分配和读写之外,还可以为后续进一步的优化手段创造条件。
同步消除 指:若一个变量被证明不会逃逸出线程,那么这个变量的读写就肯定不会出现竞争的情况,那么对这个变量实施的同步措施也就可以消除掉。
说了逃逸分析的这些作用,那么Java虚拟机是否有对对象做逃逸分析呢?
答案是否。
关于逃逸分析的论文在1999年就已经发表,但直到Sun JDK 1.6才实现了逃逸分析,而且直到现在这项优化尚未足够成熟,仍有很大的改进余地。不成熟的原因主要是不能保证逃逸分析的性能收益必定高于它的消耗。因为逃逸分析本身就是一个高耗时的过程,假如分析的结果是没有几个不逃逸的对象,那么这个分析所花费时候比优化所减少的时间更长,这是得不偿失的。
所以目前虚拟机只能采用不那么准确,但时间压力相对较小的算法来完成逃逸分析。还有一点是,基于逃逸分析的一些优化手段,如上面提到的“栈上分配”,由于HotSpot虚拟机目前的实现方式导致栈上分配实现起来比较复杂,因此在HotSpot中暂时还没有做这项优化。
事实上,在java虚拟机中,有一句话是这么写的:
The heap is the runtime data area from which memory for all class instances and arrays is allocated。
堆是所有的对象实例以及数组分配内存的运行时数据区域。