V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
15399905591
V2EX  ›  Python

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

  •  
  •   15399905591 · 2021-04-12 16:55:46 +08:00 · 4239 次点击
    这是一个创建于 1328 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前准备使用 flask 搭建微服务,但是有以下问题不知道解决

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

    上面这些问题在 java 微服务网关有 Spring Cloud 那一套, 那 python 使用什么技术栈呢?
    35 条回复    2021-08-24 17:06:05 +08:00
    sujin190
        1
    sujin190  
       2021-04-12 17:09:06 +08:00
    没有需求要用很多机器组集群似乎不是很需要注册中心啥的吧,python 估计这种大型集群用的少,搞得人很少
    15399905591
        2
    15399905591  
    OP
       2021-04-12 17:11:40 +08:00
    @sujin190 我想了一个替代方案, 每个服务配一个子域名, 使用 nginx 通过 url 路径自动转发子域名。但是这种方案感觉不够好,如果需要扩容的时候,需要手动修改配置。
    abersheeran
        3
    abersheeran  
       2021-04-12 17:14:18 +08:00   ❤️ 1
    有种东西叫 k8s
    tabris17
        4
    tabris17  
       2021-04-12 17:16:00 +08:00
    nameko+envoy
    sujin190
        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 的网关、自动注册、健康监控啥的本来就和你用啥语言啥框架无关,要啥都有了吧
    15399905591
        6
    15399905591  
    OP
       2021-04-12 17:26:45 +08:00
    @sujin190 这些只是解决了服务治理问题, 主要问题是分布式事务问题。
    abersheeran
        7
    abersheeran  
       2021-04-12 17:27:55 +08:00
    对了,你用 Python 搞微服务。那我推销一下自研的 rpc 框架 https://github.com/abersheeran/rpc.py 跨语言,但是如果客户端和服务端都是 python,体验效果最好。调用远程函数就跟调用本地函数一样。
    abersheeran
        8
    abersheeran  
       2021-04-12 17:33:28 +08:00
    @15399905591 分布式事务的实现和语言无关啊,都是调第三方服务的 API 。
    15399905591
        9
    15399905591  
    OP
       2021-04-12 17:34:52 +08:00
    @abersheeran 已 star
    sujin190
        10
    sujin190  
       2021-04-12 17:35:17 +08:00
    @15399905591 #6 所谓分布式事务大多实现都是两步提交,其核心还是每个操作都要实现执行、提交和回滚三个操作,这个自己封装一下实现也不麻烦吧,估计能够直接像数据库一样无感知的分布式事务应该是不存在的吧
    15399905591
        11
    15399905591  
    OP
       2021-04-12 17:36:25 +08:00
    @abersheeran 能推荐下类似 python 用的分布式事务组件
    15399905591
        12
    15399905591  
    OP
       2021-04-12 17:41:47 +08:00
    @sujin190 感谢大佬不理赐教,但我不太明白同步接口怎么解决呢? 比如我下订单,有创建订单与扣减库存两个接口在不同服务。 我怎么保证两边同时提交了。
    sujin190
        13
    sujin190  
       2021-04-12 17:55:08 +08:00   ❤️ 2
    @15399905591 #12 其实不复杂,就是创建订单和减库存都需要提供三个接口,分别是执行创建订单、提交创建订单操作和回滚创建订单操作,扣减库存也是一样的

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

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

    另外,看你在 12 楼的回复,你对分布式事务的原理似乎不太清楚?建议先去了解了解,你才好做权衡。
    seven123
        24
    seven123  
       2021-04-13 09:39:55 +08:00
    python 搞微服务小点的还行,服务多了,架构大了还是上 Spring Cloud Alibaba 吧,大而全的解决方案不用白不用...

    网关注册这些用 k8s 就可以搞定,分布式事物这边 java 又比较多的选择,而 python 似乎没有现成的解决方案,不过还有一部分公司是使用 MQ 消息队列来做的分布式事务。你也可以考虑自己实现一个。
    ykb8121
        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,不过有很多局限性
    15399905591
        26
    15399905591  
    OP
       2021-04-13 11:23:52 +08:00
    @abersheeran 其实就是项目越做做大,原来用的单体架构,已经越来越不能满足业务需求了,现在需要进行服务拆分。
    15399905591
        27
    15399905591  
    OP
       2021-04-13 11:26:31 +08:00
    @seven123 深有同感,python 在 web 方向确实感觉比较弱,缺少生态, 好多轮子都要自己造,java go 在这方面好很多。
    15399905591
        28
    15399905591  
    OP
       2021-04-13 11:27:06 +08:00
    @15399905591 多谢, 我去研究下
    catchexception
        29
    catchexception  
       2021-04-13 13:44:08 +08:00   ❤️ 1
    反驳上面某个说法:分布式事务并不是调用第三方服务 API 。
    核心问题是保证最终的数据一致性问题,而常见的做法往往是通过可靠消息来实现异步确保型的最终一致。
    zoharSoul
        30
    zoharSoul  
       2021-04-13 16:18:30 +08:00
    @sujin190 存在的, 比如阿里的 seata
    sujin190
        31
    sujin190  
       2021-04-13 16:37:29 +08:00
    @liuhan907 #21
    @zoharSoul #30 但是这种并不能很好处理多服务的分布式事务,很多时候并不能通过简单回滚数据库操作就能回滚各服务的全部操作,你们说的这种应该叫做单服务的多数据库分布式事务,比如楼主说的下单接口请求订单服务和库存服务,每个服务都有自己的流程步骤,数据库操作时各自发起的,并不是全局发起的
    zoharSoul
        32
    zoharSoul  
       2021-04-13 18:06:15 +08:00
    @sujin190 #31, 这个就是用于多服务的
    sujin190
        33
    sujin190  
       2021-04-13 18:20:44 +08:00
    @zoharSoul #32 看调用时序图虽然可以用于多服务,但是并代表就是和单服务一样靠谱的吧,你们做的?
    liuhan907
        34
    liuhan907  
       2021-04-13 21:43:22 +08:00 via Android
    @sujin190
    我并不是在说 seata 。现成的话,比如 Orleans 提供的 actor 状态事务,就是一种侵入式的分布式事务。但是 Orleans 的实现仅限它自己用,如果想用到别的地方就得参考它的论文自己实现一个。
    15399905591
        35
    15399905591  
    OP
       2021-08-24 17:06:05 +08:00
    在网上找到一边有关于分布式事务的方案,https://learnku.com/articles/59145, 里面分享了 https://github.com/yedf/dtm 作为分布式事务使用方案,这里分享一下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   975 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:05 · PVG 04:05 · LAX 12:05 · JFK 15:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.