
1、@宓文明 提问:
请教:大家有没有遇到过 SOFAArk 工程这样的情况:双机房集群部署(检查模块 jar 大小相同、MD5 相同、部署时间相同),其中一台服务器中报错 NoClassDefFoundError(调用模块工具类的静态方法时,工具类找不到),其余的服务器都 OK。
A:你们登录到机器上去,堆栈是有的;这种问题可能是因为底层有 class 没找到,两个思路:
版本冲突 ,不一定局限在你的 JsonUtil 这个类,里面的类也有可能引发 。
通过 arthas ,分析下不同 bizClassLoader 加载 JsonUtil 的情况。
SOFAArk:https://github.com/sofastack/sofa-ark
2、@郭强 提问:
MOSN 是如何保证一定是先于业务容器启动,并且保证是后于业务容器销毁呢?
A:启动就是按 pod 里的容器顺序启动,MOSN 容器在 APP 容器前。APP 容器内的应用进程启动前会检查 MOSN 的端口是否存活,得等到 MOSN 进程启动完成才能继续。销毁 pod 的时候没有特别处理,就是摘了pod 的流量整个销毁。
MOSN:https://github.com/mosn/mosn
3、@郭强 提问:
APP 容器内的应用进程启动前会检查 MOSN 的端口是否存活。
这个是怎么做到的呢,是自动修改应用容器的 command 配置?还是说需要应用进程的 dockerfile 保证一定规范吗?
A:蚂蚁内部的 Kubernetes 有针对性的做一些定制改造支持,标准 k8s 目前是控制不了容器启动顺序的; 最好的方式还是 k8s 原生支持 sidecar lifecycle,没有这个的话,相对折中的方式就是在应用启动脚本前 check 下了。
MOSN:https://github.com/mosn/mosn
4、@饶文强 提问:
请教一下:我不是很理解这一步锁撤销的步骤:线程 A 进入同步代码块方法,尝试获取偏向锁,此时若 CAS 线程 id 替换失败,为什么涉及一个偏向锁撤销,线程 A 不是没有获取到锁。我的理解是此时锁对象的偏向锁线程 id 不是线程A本身,为什么还需要偏向锁撤销?
A:因为偏向锁可以被降级,其他的不可以,这个时候需要升级锁或降级锁;偏向锁持有者是不会做降级操作的,只有前来竞争锁的线程会去判断。
Seata:https://github.com/seata/seata
5、@莹 提问:
有个场景:tcc 模式,try 方法创建订单记录,插入到数据库,然后异常回滚,在 rollback 方法中把这个订单记录根据主键删除,请问数据库主键字段怎么传过去?
A :可以通过一阶段把 xid 对应业务信息存在 redis 中,二阶段通过 xid 拿出来使用。
Seata:https://github.com/seata/seata
6、@敲跃 提问:
问个问题:Seata 的 at 和 saga 模式 一阶段本地事务已提交,为了防止这部分数据被其他事务读到,文档给的解决方案 >>> 脏读 select 语句加 for update,代理方法增加 @GlobalLock+@Transactional 或 @GlobalTransaction <<< ;实际操作的时候:涉及到本地事务的表的所有 sql 和方法都要这么改造,会不会成本太大,有没有其他好点的解决方案?
A :涉及到所有的写入口加上 @GlobalTransaction 即可;只读场景 @GlobalLock +for update 即可;读了就写场景一定要 @GlobalTransaction,只读了给前端展示之类的。
Seata:https://github.com/seata/seata

本文分享自微信公众号 - 金融级分布式架构(Antfin_SOFA)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。