1
sujin190 2021-04-12 17:09:06 +08:00
没有需求要用很多机器组集群似乎不是很需要注册中心啥的吧,python 估计这种大型集群用的少,搞得人很少
|
2
15399905591 OP @sujin190 我想了一个替代方案, 每个服务配一个子域名, 使用 nginx 通过 url 路径自动转发子域名。但是这种方案感觉不够好,如果需要扩容的时候,需要手动修改配置。
|
3
abersheeran 2021-04-12 17:14:18 +08:00 1
有种东西叫 k8s
|
4
tabris17 2021-04-12 17:16:00 +08:00
nameko+envoy
|
5
sujin190 2021-04-12 17:20:43 +08:00
@15399905591 #2 如果你只是想要这样的,nginx 的 lua 版本 open'rest905591 #2 如果你只是想要这样的,nginx 的 lua 版本 openresty 应该是支持通过接口配置 upstream 的吧,你直接在服务启动的过程中调接口添加自己就好了啊
否则如所 @abersheeran #3 说 k8s 呗,k8s 的网关、自动注册、健康监控啥的本来就和你用啥语言啥框架无关,要啥都有了吧 |
6
15399905591 OP @sujin190 这些只是解决了服务治理问题, 主要问题是分布式事务问题。
|
7
abersheeran 2021-04-12 17:27:55 +08:00
对了,你用 Python 搞微服务。那我推销一下自研的 rpc 框架 https://github.com/abersheeran/rpc.py 跨语言,但是如果客户端和服务端都是 python,体验效果最好。调用远程函数就跟调用本地函数一样。
|
8
abersheeran 2021-04-12 17:33:28 +08:00
@15399905591 分布式事务的实现和语言无关啊,都是调第三方服务的 API 。
|
9
15399905591 OP @abersheeran 已 star
|
10
sujin190 2021-04-12 17:35:17 +08:00
@15399905591 #6 所谓分布式事务大多实现都是两步提交,其核心还是每个操作都要实现执行、提交和回滚三个操作,这个自己封装一下实现也不麻烦吧,估计能够直接像数据库一样无感知的分布式事务应该是不存在的吧
|
11
15399905591 OP @abersheeran 能推荐下类似 python 用的分布式事务组件
|
12
15399905591 OP @sujin190 感谢大佬不理赐教,但我不太明白同步接口怎么解决呢? 比如我下订单,有创建订单与扣减库存两个接口在不同服务。 我怎么保证两边同时提交了。
|
13
sujin190 2021-04-12 17:55:08 +08:00 2
@15399905591 #12 其实不复杂,就是创建订单和减库存都需要提供三个接口,分别是执行创建订单、提交创建订单操作和回滚创建订单操作,扣减库存也是一样的
具体实现如果你用的 mysql 的话,可以在第一个接口就把数据提交过去,然后开 mysql 事务,然后执行 sql,但是不提交 mysql 事务,如果创建订单和扣减库存两个操作的第一个接口都执行成功的话,就调用创建订单和扣减库存的第二个接口,提交刚才第一个接口打开的 mysql 事务,前两个接口有任何事务再走第三个接口回滚刚才的操作就行,回滚的时候可以判断下,如果 mysql 事务还没提交就直接回滚 mysql 的事务就行,否则可以考虑删掉之前添加的数据,当然如果你觉得删数据有风险,这种很小概率失败的风险也无所谓当然也可以不删 开 mysql 事务的时候注意添加一个超时,超时也执行回滚,一般来说分布式事务的一致性肯定是要弱于 mysql 事务这种的,就看你能承受多高的不一致概率了,如果像扣钱这样需要非常高一致性的操作就最好不要用分布式事务了 |
15
15399905591 OP @sujin190 多谢大佬解惑, 我自己去试试
|
16
johnsona 2021-04-12 18:43:48 +08:00 via iPhone
traefik consul 和 rm -rf
|
17
jhdxr 2021-04-12 18:56:00 +08:00
python 其实也可以配合 Spring Cloud 用,我记得之前看到过 eureka client 的 python 版本
|
18
so1n 2021-04-12 19:18:07 +08:00
我也是自己手撸一套,但是注册中心还没弄
|
19
hunk 2021-04-12 19:31:40 +08:00
一看标题,感觉是 k8s 合适,以 api 啥的做好规划和区分。
|
20
sujin190 2021-04-12 19:43:01 +08:00
@bthulu #14 不能强的原因是分布式事务步骤太多,环境不能完全一致,延迟不稳定,如果无法解决中间问题就很难很强,而分布式数据库就是用设计来解决这些问题的吧,简化步骤,构造一致性环境延迟,增加补偿纠错环节,所以你真需要那么高的一致性话,还不如直接用分布式数据来的靠谱
|
22
laike9m 2021-04-13 02:14:49 +08:00
|
23
abersheeran 2021-04-13 09:22:56 +08:00
@15399905591 Java 用的什么,Python 就可以用什么。我又不知道你业务需求侧重哪儿,你按照需求去 Java 生态圈挑服务,再找 Python 实现的客户端去用就完事了。
另外,看你在 12 楼的回复,你对分布式事务的原理似乎不太清楚?建议先去了解了解,你才好做权衡。 |
24
seven123 2021-04-13 09:39:55 +08:00
python 搞微服务小点的还行,服务多了,架构大了还是上 Spring Cloud Alibaba 吧,大而全的解决方案不用白不用...
网关注册这些用 k8s 就可以搞定,分布式事物这边 java 又比较多的选择,而 python 似乎没有现成的解决方案,不过还有一部分公司是使用 MQ 消息队列来做的分布式事务。你也可以考虑自己实现一个。 |
25
ykb8121 2021-04-13 10:32:25 +08:00
好久之前用过 ele 开源的 thrift 搞微服务 https://github.com/Thriftpy/thriftpy 有不少坑。 现在是直接用 rpc 来调了 Pyro
https://pyro5.readthedocs.io/en/latest/ db 同步一致直接用的 etcd,不过有很多局限性 |
26
15399905591 OP @abersheeran 其实就是项目越做做大,原来用的单体架构,已经越来越不能满足业务需求了,现在需要进行服务拆分。
|
27
15399905591 OP @seven123 深有同感,python 在 web 方向确实感觉比较弱,缺少生态, 好多轮子都要自己造,java go 在这方面好很多。
|
28
15399905591 OP @15399905591 多谢, 我去研究下
|
29
catchexception 2021-04-13 13:44:08 +08:00 1
反驳上面某个说法:分布式事务并不是调用第三方服务 API 。
核心问题是保证最终的数据一致性问题,而常见的做法往往是通过可靠消息来实现异步确保型的最终一致。 |
31
sujin190 2021-04-13 16:37:29 +08:00
|
34
liuhan907 2021-04-13 21:43:22 +08:00 via Android
@sujin190
我并不是在说 seata 。现成的话,比如 Orleans 提供的 actor 状态事务,就是一种侵入式的分布式事务。但是 Orleans 的实现仅限它自己用,如果想用到别的地方就得参考它的论文自己实现一个。 |
35
15399905591 OP 在网上找到一边有关于分布式事务的方案,https://learnku.com/articles/59145, 里面分享了 https://github.com/yedf/dtm 作为分布式事务使用方案,这里分享一下
|