ARTS打卡-第一周

Algorithm:每周至少做一个 leetcode 的算法题

36. 有效的数独

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public boolean isValidSudoku(char[][] board) {
for (int x = 0; x < board.length; x++) {
for (int y = 0; y < board[0].length; y++) {
if (!(checkColumn(board, x) && checkRow(board, y) && checkTable(board, x, y))) {
return false;
}
}
}
return true;
}

public boolean checkTable(char[][] board, int x, int y) {
byte[] tmp = new byte[9];
int beginX = x / 3 * 3;
int beginY = y / 3 * 3;
for (int i = beginX; i < beginX + 3; i++) {
for (int j = beginY; j < beginY + 3; j++) {
if (board[i][j] != '.') {
tmp[board[i][j] - '1'] += 1;
}
}
}
return checkHasZero(tmp);
}

public boolean checkColumn(char[][] board, int x) {
byte[] tmp = new byte[9];
for (int i = 0; i < 9; i++) {
if (board[i][x] != '.') {
tmp[board[i][x] - '1'] += 1;
}
}
return checkHasZero(tmp);
}

public boolean checkRow(char[][] board, int y) {
byte[] tmp = new byte[9];
for (int i = 0; i < 9; i++) {
if (board[y][i] != '.') {
tmp[board[y][i] - '1'] += 1;
}
}
return checkHasZero(tmp);
}

public boolean checkHasZero(byte[] tmp) {
for (int i = 0; i < 9; i++) {
if (tmp[i] > 1) {
return false;
}
}
return true;
}

Review:阅读并点评至少一篇英文技术文章

Seata是一个分布式事务解决框架,在传统的单数据库系统演变为微服务多数据库系统时,由于一个业务的调用链可能涉及到多个微服务系统,从而对多个数据库的数据CURD时,一旦出现异常等原因导致需要数据rollback,这时候,我们就需要对每一个开启了transaction进行rollback。

当调用链中涉及的数据库数量很少的时候,这样逐个手动rollback当然也没什么问题,但是一旦数量多的时候,这样必然导致大量的代码侵入,而seata分布式事务框架则解决了这个问题。

Seata分为3个模块:

  1. Transaction Coordinator(TC):维护全局事务状态,并驱动全局事务的提交和回滚
  2. Transaction Manager(TM):定义全局事务的作用域,管理全局事务的生命周期,全局事务开启、提交、回滚的管理者
  3. Resource Manager(RM):管理资源本地分支事务的工作,并把分支事务注册至TC的全局事务中,在TC驱动全局事务的提交、回滚等时,对全局事务关联下的分支事务做出相应的操作

Seata具体流程:

  1. TM要求TC开启一个新的全局事务,TC创建全局事务的XID
  2. XID跟着微服务执行链流动
  3. RM根据XID把本地分支事务注册关联到TC的全局事务中
  4. TM根据XID要求TC提交或者回滚全局事务
  5. TC根据XID找到所有本地分支事务,驱动RM对事务进行提交或者回滚

Seata使用思考:

  1. 减少了分布式事务实现的代码侵入
  2. 使用全局事务并且生成全局事务XID关联每一个本地事务,使事务间具有关联性

Tip:学习至少一个技术技巧

Share:分享一篇有观点和思考的技术文章

Re:从零开始的领域驱动设计

文中对Repository和包结构的观点和思考,我觉得非常有意义,很多时候,我们对Repository的编写以及包结构的设计往往都是按照习惯思维来做,却对其合理性缺乏一个思考。