codingapi / codingapi/tx-lcn

同一个微服务模块多实例,TM会发生事物通知TC错乱的问题

オープン
#368 コメント 22 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
Java
スター
4.2k
フォーク
1.4k
PR マージ指標
30日以内にマージされた PR はありません

説明

- [ ] I have searched the [issues](https://github.com/codingapi/tx-lcn/issues) of this repository and believe that this is not a duplicate.

### 1. Bug Description
在多台机器上部署相同的服务模块moduleA(ip不同,端口也不同),代开tm的debug日志,发现在请求再moduleA_1的时候是正常的,然后内部服务调用切换到moduleA_2的时候,事物会发生超时,然后才删除redis的资源锁.如果再超时的这段时间内,有去获取排他锁会发生resource loack的异常情况.

在源码排查的情况中发现,在tm进行事务通知tx的时候
![image](https://user-images.githubusercontent.com/11519151/57433478-2b989d80-726b-11e9-956c-5a88d15831b6.png)
只会通知一个? 而且这边获取modId的时候进行获取的是模块名,即使我再tc那边重写的modId的生成规则,但是注册到tm的时候这个再客户端看来是modid的值变成了labelName
所以再通知tc事务的时候错乱了.下面是获取modid的方法
![image](https://user-images.githubusercontent.com/11519151/57433607-7c0ffb00-726b-11e9-8dad-0713224e8381.png)
拿到是moduleA这个模块名,而不是具体的moduleA_1或者module_2具体的服务标识.

### 2. Environment:
- JDK version:1.8
- OS: ubuntu 16.0.4
- TX-LCN version: 5.0.2
- Others:

### 3. Exception Stacktrace

```
Paste your Exception Stacktrace here!
```

### 4. Tour Idea
所以,我这边想问下,当前5.0.2这个版本是不是对提供的modid的更改接口对接到tm的功能是否还没有完成?当前的labelName好像只是作为tm的后台展示所用,并没有其他的作用,那么当前是否不支持tc的多实例的应用?

我们这边对获取modid获取方式进行了更改,取的是labelName而不是appname
![image](https://user-images.githubusercontent.com/11519151/57433873-28ea7800-726c-11e9-9d35-9f4476b5f34c.png)

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

調査の方向性

記載された JDK 1.8、Ubuntu 16.04、TX-LCN 5.0.2 の環境で、moduleA の 2 つのインスタンスを使用して報告されたフローを再現します。まず issue に示されている TM transaction-notification と modId registration のパスから始め、次に moduleA_1 と moduleA_2 の切り替え中に Redis リソースロックを追跡します。完了条件は、複数インスタンスの通知がタイムアウトやリソースロックエラーなしで正しいトランザクション参加者を対象とすることです。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
java, redis
領域
backend, distributed-systems
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
停滞
明瞭さ
説明が足りない
初心者へのやさしさ
25/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。