Kamafeel

求其上,得其中;求其中,得其下,求其下,必败


  • 首页

  • 归档

查找jar包内容

发表于 2022-03-23 | 分类于 linux

用途

某些情况需要查找jar内部的文件列表情况

脚本

1
2
3
4
5
#!/bin/bash
ls pdi* | while read jarfile; do
echo "########### start find ####### $jarfile"
jar -tf $jarfile | grep "$1"
done

DDD-分布式一致性

发表于 2022-03-18 | 更新于 2022-03-24 | 分类于 微服务 , DDD

分布式一致性

不要局限于数据库事务,也可能是业务事务,俗称长事务

实现要素

接口幂等性(分布式存在重试机制)

内部状态管控(状态机)

异常推进模式(重试,查询对端状态)

流水型数据(进出接口留存为单据,微服务调用链)

最终对账(分析微服务对应的db,业务数据是否一致,实时/离线对账)

空回滚
悬挂

实现方案

2PC,3PC
TCC(客户端 需要实现try, confirm, cancel 三个接口,侵入太大)
可靠消息最终一致性(利用rocketmq的prepare,confirm,死信消息机制实现)
本地消息表(利用本地数据库事务,一般业务均可以使用)
最大努力通知(一般适用于调用第三方支付成功后,回调本地业务模块),不断重试

框架

seata (AT、TCC、SAGA、XA)
性能消耗较大,存在全局锁,和undoSQL的生成

相关协议

XA 分布式事务协议,数据库原生支持(mysql5.7+,db2,oracle)

基于事件溯源的分布式事务

利用事件溯源DDD模式,消费端不停重试,当无法成功,发消息到TM进行事务回滚,TM分析消息链,反向调用上游服务,进去消息回溯

上游重新生成,回退消息序列的,实体物化视图。

参考

https://xiaomi-info.github.io/2020/01/02/distributed-transaction/

https://segmentfault.com/a/1190000039910621
https://www.infoq.cn/article/8bu33kusyj6p-waaoelt

https://segmentfault.com/a/1190000040321750

https://mp.weixin.qq.com/s?__biz=MzAxNDEwNjk5OQ==&mid=2650454838&idx=1&sn=b4626ad3db1e5b13b27387a0b6cf9c8f&chksm=8396732eb4e1fa389b8d623311571a959c31d93a1d7ce2e2ab0d6b3582e42bc167cea8b93cb2&mpshare=1&scene=1&srcid=0321KVLkIjhgMKWius8yNRlq&sharer_sharetime=1647856913742&sharer_shareid=0f5daba1c53304b790c473ce7b5b4b10&key=0b1431e25a2ba464217d69b0c3a69369fb2e749ed5794a4e3efbd31cfd6c6c91b2858955730f7d8a3940086f169f519edd613d3a701f8ee3d7a636b52ff3ae8e08fdd5b67a04cf73c89f560c7b9143fc5b79f3b65dc53234dbf96ecba0d382eee6703b5946fdb43b76b0550a5f0d3fceacc7c67d69f1fc5f319f26c82f9f8165&ascene=1&uin=OTM4NTY4MzU%3D&devicetype=Windows+10&version=62060844&lang=zh_CN&exportkey=AT7dyAUBsQpgjdVY3kive0s%3D&acctmode=0&pass_ticket=gPnUzsTHhOsokjn3q9eNRh2cwjCEQG3GnX5vxMnzgNqmQFLo6ziAqYul3cPyoUEa&wx_header=0

国产数据库适配

发表于 2022-03-18 | 更新于 2022-03-24 | 分类于 数据库 , 国产数据库

jdbc

神通数据库不支持jdbc指定模式名,达梦时间计算语法和MYSQL存在区别

1
2
3
4
5
6
7
8
9
#DM7
jdbc.driverClassName=dm.jdbc.driver.DmDriver
orm.databasePlatform=org.hibernate.dialect.DmDialect
db.url=jdbc:dm://192.168.40.147:5236?schema=PDI&useUnicode=true&characterEncoding=UTF-8

##shentong7
jdbc.driverClassName=com.oscar.Driver
orm.databasePlatform=org.hibernate.dialect.OscarDialect
db.url=jdbc:oscar://192.168.30.179:2003/OSRDB?useUnicode=true&characterEncoding=UTF-8

JPA方言

Dm7JdbcDriver18.jar
DmDialect-for-hibernate5.3.jar

oscarHibernate54.jar
oscarJDBC8.jar

注意看jar容量,避免驱动错误

alt

包名说明:
18,8为jdk1.8编译
Hibernate(54,5.3) 一般适配Hibernate5.3-5.4方言

数据迁移

用官方数据迁移工具

可视化工具

用官方客户端

perl处理文本例子

发表于 2022-03-16 | 分类于 linux

文本处理

perl, awk,sed

perl语言已经不需要学习进阶(to dead),最多使用其处理一些文本。

例子

perl -pi -e “s/aaa/bbb/gi” test.txt
把test.txt文件中的字符aaa替换成bbb

perl -pi.bak -e “s/aaa/bbb/gi” test.txt
把test.txt文件中的字符aaa替换成bbb,并生成一个test.txt.bak的备份文件

find ./ -name “*.txt” | xargs perl -pi.bak -e “s/aaa/bbb/gi”
把当前目录下所有的.txt文件中的字符aaa替换成bbb,并生成相应的.bak的备份文件

复杂逻辑

如果存在复杂逻辑,请使用python

DDD-可靠消息

发表于 2022-03-15 | 分类于 微服务 , DDD

消息发送端

1.生成消息唯一幂等ID ->存储消息参数

2.在本服务内实现监听(JPA entity postPersist),更新实体物化视图。

3.–>异步投递到MQ–>更新是否投递标致为true

4.如果投递MQ失败,重试机制。

5.定期扫描投递标致为false的数据,再次发送

消息接受端

1.存储消息参数和消息的幂等ID,为后续幂等做判断依据。

2.判断消息里面的sequenceNumber(事件序列)和本地实体聚合的事件处理记录的对比,只消费差异值为 1 的事件 (保障事件顺序一致性)
(如果本地实体聚合的事件处理记表量大,可以使用分表等技术)
(可以使用kafka分区技术,提高消息处理并发量)
2.处理消息–>回写MQ的 ACK

3.如果失败放失败队列deadLetterQueueName

4.定时任务/或者重启时,处理这个DLQ里面的消息

DDD-事件溯源

发表于 2022-03-11 | 更新于 2022-03-15 | 分类于 微服务 , DDD

核心价值

1.减少并发冲突
2.记录每个操作细节
3.解耦领域数据模型与业务消息领域数据(四色模型-消息)

实施方案

1.记录事件信息,一定保障(顺序写,时序性,带版本戳,消息ID的生成,微服务节点的无状态化,和ID生成器的workId如何配合)
2.配合CQRS使用,实体最新状态使用”物化视图”(可以定时生成快照,避免全量重播事件,可以使用异步模式)
3.消费事件的服务,需要注意幂等
4.事件解耦后的最终一致性(后续章节描述)
5.事件的消费,一般放到领域aggregate中,以实现领域逻辑内聚。(当然具体逻辑可以使用gateway接口,在infrastructure具体实现)
事件消费也可以使用状态机,提示领域逻辑的可视化。

1
2
3
4
5
6
7
@CommandHandler
public ContractAggregate(CreateContractCommand command, MetaData metaData, UIDGenerator generator) {
if (null == command.getIdentifier()) {
command.setIdentifier(generator.getId());
}
AggregateLifecycle.apply(new ContractCreatedEvent(command.getIdentifier(), command.getName(), command.getPartyA(), command.getPartyB()), metaData);
}

框架支持

Java Axon 框架
实体快照,储存事件,事件重试/升级,事件溯源(fetch拉事件)

参考

http://soooban.github.io/2019/06/10/Event-Sourcing-And-CQRS/

引申问题

实现可靠消息,参加后续文章

3种数据库查询引擎

发表于 2022-03-11 | 分类于 数据库 , 基础

迭代模型/火山模型(Iterator Model)

又称 Volcano Model 或者 Pipeline Model
每一种操作抽象为一个 Operator,将整个 SQL 构建成一个 Operator 树,查询树自顶向下的调用next()接口,数据则自底向上的被拉取处理

一次pull一条,调用次数太多,CPU执行效率低下。

相关数据库:SQLite、MongoDB、Impala、DB2、SQLServer、Greenplum、PostgreSQL、Oracle、MySQL

物化模型(Materialization Model)

同上,批量拉取,但是数据集不能太多。

##向量化/批处理模型(Vectorized / Batch Model)##

每次调用 next() 函数会返回一批的元组(tuples)

相关数据库:Presto、snowflake、SQLServer、Amazon Redshift,Spark 2.x,hive(ORC 格式来存储数据,将 hive.vectorized.execution.enabled 参数设置为 true)

参考

https://www.modb.pro/db/45265

物化视图

这个概念,只是把视图(只保存SQL)进行了计算和数据物化

分布式链路追踪

发表于 2022-03-09 | 分类于 微服务 , 理论

SleuthZipkin

底层原理

Trace 整个微服务调用树关系
Span 树的叶子

参考

https://www.cnblogs.com/cy0628/p/15195918.html
https://juejin.cn/post/6844903761438048269

7层网络协议

发表于 2022-03-09 | 分类于 架构 , 基础层

总览

一般业务会用到上面的4层

alt

网关三剑客-APISIX

发表于 2022-03-09 | 分类于 架构 , 基础层

总论

一般场景openresty+lua足够
https://moonbingbing.gitbooks.io/openresty-best-practices/content/

喜欢要个API编排界面,KONG

需要很云原生 APISIX
https://www.apiseven.com/zh/blog/why-we-need-Apache-APISIX

对于七层协议的支持

nginx一般是4层以上

APISIX支持7层

APISIX和K8S

https://www.36dianping.com/case/7672

123…21

Kamafeel

204 日志
57 分类
129 标签
© 2022 Kamafeel
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Pisces v7.1.2