有大佬使用 Python 技术栈搞过微服务么?

15399905591 29天前 14

目前准备使用 flask 搭建微服务,但是有以下问题不知道解决

1 、网关怎么处理?
2 、注册中心问题
3 、分布式事务问题

上面这些问题在 java 微服务网关有 Spring Cloud 那一套, 那 python 使用什么技术栈呢?
最新回复 (34)
  • sujin190 23天前
    引用 2
    没有需求要用很多机器组集群似乎不是很需要注册中心啥的吧,python 估计这种大型集群用的少,搞得人很少
  • 楼主 15399905591 23天前
    引用 3
    @sujin190 我想了一个替代方案, 每个服务配一个子域名, 使用 nginx 通过 url 路径自动转发子域名。但是这种方案感觉不够好,如果需要扩容的时候,需要手动修改配置。
  • abersheeran 23天前
    引用 4
    有种东西叫 k8s
  • tabris17 23天前
    引用 5
    nameko+envoy
  • sujin190 23天前
    引用 6
    @15399905591 #2 如果你只是想要这样的,nginx 的 lua 版本 open'rest905591 #2 如果你只是想要这样的,nginx 的 lua 版本 openresty 应该是支持通过接口配置 upstream 的吧,你直接在服务启动的过程中调接口添加自己就好了啊

    否则如所 @abersheeran #3 说 k8s 呗,k8s 的网关、自动注册、健康监控啥的本来就和你用啥语言啥框架无关,要啥都有了吧
  • 楼主 15399905591 23天前
    引用 7
    @sujin190 这些只是解决了服务治理问题, 主要问题是分布式事务问题。
  • abersheeran 23天前
    引用 8
    对了,你用 Python 搞微服务。那我推销一下自研的 rpc 框架 https://github.com/abersheeran/rpc.py 跨语言,但是如果客户端和服务端都是 python,体验效果最好。调用远程函数就跟调用本地函数一样。
  • abersheeran 23天前
    引用 9
    @15399905591 分布式事务的实现和语言无关啊,都是调第三方服务的 API 。
  • 楼主 15399905591 23天前
    引用 10
    @abersheeran 已 star
  • sujin190 23天前
    引用 11
    @15399905591 #6 所谓分布式事务大多实现都是两步提交,其核心还是每个操作都要实现执行、提交和回滚三个操作,这个自己封装一下实现也不麻烦吧,估计能够直接像数据库一样无感知的分布式事务应该是不存在的吧
  • 楼主 15399905591 23天前
    引用 12
    @abersheeran 能推荐下类似 python 用的分布式事务组件
  • 楼主 15399905591 23天前
    引用 13
    @sujin190 感谢大佬不理赐教,但我不太明白同步接口怎么解决呢? 比如我下订单,有创建订单与扣减库存两个接口在不同服务。 我怎么保证两边同时提交了。
  • sujin190 23天前
    引用 14
    @15399905591 #12 其实不复杂,就是创建订单和减库存都需要提供三个接口,分别是执行创建订单、提交创建订单操作和回滚创建订单操作,扣减库存也是一样的

    具体实现如果你用的 mysql 的话,可以在第一个接口就把数据提交过去,然后开 mysql 事务,然后执行 sql,但是不提交 mysql 事务,如果创建订单和扣减库存两个操作的第一个接口都执行成功的话,就调用创建订单和扣减库存的第二个接口,提交刚才第一个接口打开的 mysql 事务,前两个接口有任何事务再走第三个接口回滚刚才的操作就行,回滚的时候可以判断下,如果 mysql 事务还没提交就直接回滚 mysql 的事务就行,否则可以考虑删掉之前添加的数据,当然如果你觉得删数据有风险,这种很小概率失败的风险也无所谓当然也可以不删

    开 mysql 事务的时候注意添加一个超时,超时也执行回滚,一般来说分布式事务的一致性肯定是要弱于 mysql 事务这种的,就看你能承受多高的不一致概率了,如果像扣钱这样需要非常高一致性的操作就最好不要用分布式事务了
  • bthulu 23天前
    引用 15
    @sujin190 有强一致的分布式事务解决方案吗
  • 楼主 15399905591 23天前
    引用 16
    @sujin190 多谢大佬解惑, 我自己去试试
  • johnsona 23天前
    引用 17
    traefik consul 和 rm -rf
  • jhdxr 23天前
    引用 18
    python 其实也可以配合 Spring Cloud 用,我记得之前看到过 eureka client 的 python 版本
  • so1n 23天前
    引用 19
    我也是自己手撸一套,但是注册中心还没弄
  • hunk 23天前
    引用 20
    一看标题,感觉是 k8s 合适,以 api 啥的做好规划和区分。
  • sujin190 23天前
    引用 21
    @bthulu #14 不能强的原因是分布式事务步骤太多,环境不能完全一致,延迟不稳定,如果无法解决中间问题就很难很强,而分布式数据库就是用设计来解决这些问题的吧,简化步骤,构造一致性环境延迟,增加补偿纠错环节,所以你真需要那么高的一致性话,还不如直接用分布式数据来的靠谱
  • liuhan907 23天前
    引用 22
    @sujin190
    有当然是有的,但是通常都不是完全的无侵入,需要在表结构上修改。
  • laike9m 23天前
    引用 23
    https://www.getambassador.io/resources/envoy-flask-kubernetes/
  • abersheeran 23天前
    引用 24
    @15399905591 Java 用的什么,Python 就可以用什么。我又不知道你业务需求侧重哪儿,你按照需求去 Java 生态圈挑服务,再找 Python 实现的客户端去用就完事了。

    另外,看你在 12 楼的回复,你对分布式事务的原理似乎不太清楚?建议先去了解了解,你才好做权衡。
  • seven123 23天前
    引用 25
    python 搞微服务小点的还行,服务多了,架构大了还是上 Spring Cloud Alibaba 吧,大而全的解决方案不用白不用...

    网关注册这些用 k8s 就可以搞定,分布式事物这边 java 又比较多的选择,而 python 似乎没有现成的解决方案,不过还有一部分公司是使用 MQ 消息队列来做的分布式事务。你也可以考虑自己实现一个。
  • ykb8121 23天前
    引用 26
    好久之前用过 ele 开源的 thrift 搞微服务 https://github.com/Thriftpy/thriftpy 有不少坑。 现在是直接用 rpc 来调了 Pyro
    https://pyro5.readthedocs.io/en/latest/ db 同步一致直接用的 etcd,不过有很多局限性
  • 楼主 15399905591 23天前
    引用 27
    @abersheeran 其实就是项目越做做大,原来用的单体架构,已经越来越不能满足业务需求了,现在需要进行服务拆分。
  • 楼主 15399905591 23天前
    引用 28
    @seven123 深有同感,python 在 web 方向确实感觉比较弱,缺少生态, 好多轮子都要自己造,java go 在这方面好很多。
  • 楼主 15399905591 23天前
    引用 29
    @15399905591 多谢, 我去研究下
  • catchexception 23天前
    引用 30
    反驳上面某个说法:分布式事务并不是调用第三方服务 API 。
    核心问题是保证最终的数据一致性问题,而常见的做法往往是通过可靠消息来实现异步确保型的最终一致。
  • zoharSoul 23天前
    引用 31
    @sujin190 存在的, 比如阿里的 seata
  • sujin190 23天前
    引用 32
    @liuhan907 #21
    @zoharSoul #30 但是这种并不能很好处理多服务的分布式事务,很多时候并不能通过简单回滚数据库操作就能回滚各服务的全部操作,你们说的这种应该叫做单服务的多数据库分布式事务,比如楼主说的下单接口请求订单服务和库存服务,每个服务都有自己的流程步骤,数据库操作时各自发起的,并不是全局发起的
  • zoharSoul 23天前
    引用 33
    @sujin190 #31, 这个就是用于多服务的
  • sujin190 23天前
    引用 34
    @zoharSoul #32 看调用时序图虽然可以用于多服务,但是并代表就是和单服务一样靠谱的吧,你们做的?
  • liuhan907 23天前
    引用 35
    @sujin190
    我并不是在说 seata 。现成的话,比如 Orleans 提供的 actor 状态事务,就是一种侵入式的分布式事务。但是 Orleans 的实现仅限它自己用,如果想用到别的地方就得参考它的论文自己实现一个。
  • 游客
    36
返回