V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tomczhen
V2EX  ›  程序员

也来记录一下第一次接私活的体验

  •  
  •   tomczhen · 2019-05-12 21:29:05 +08:00 · 3201 次点击
    这是一个创建于 2013 天前的主题,其中的信息可能已经有所发展或是发生改变。

    来源

    所在部门领导答应另一个部门领导解决业务上的一些问题,刚好是我负责。由于各总原因,没过试用期,领导需要我离职了,跟另一个部门领导确认后,就在离职前 2 天加个班,交付了已经完成的部分。

    大概 2 个月后,前同事找我,说要继续做剩下的部分。

    项目内容

    其实就是把已经在用的 ERP ( Oracle 数据库) 对接简道云的 API,包括推送数据到简道云和从简道云接收表单数据两个部分,而 ERP 这块是没有源代码进行二次开发的,只能修改下数据库存储过程。

    由于时间限制,在职时交付的代码主要目的是验证可行性,完成剩余部分的功能需要做一些重构。做了一个分两阶段交付的计划,首先是重构基础代码,再来交付添加新功能的代码。

    数据推送

    之前有做过一个 Laravel 项目,用的 Laravel Queue 加上数据库作为队列存储。因为 Lavael Queue 的实现是轮询表,然后代码维护了队列各种逻辑,觉得不够优雅 :doge:,加上这次需要用 Python 来实现,所以要另找办法。

    仔细查了 Oracle 的官方文档之后发现有个 Advanced Queue 功能,另外还顺便查了下 SQL Server 的 Service Broken 也有个 Message Queue,并且两者都有 CDC 功能。因为不需要收集所有变化的数据,所以就不用 CDC 了。

    实现思路是由存储过程将定义好结构的 Message Object push 到 Queue,python 代码获取,并转换结构,推送到指定的 API。整个过程是异步的,不会增加事务耗时,队列的有序、可靠性、重试直接用数据库自带机制就能实现。

    坑总是避不掉的,这里新旧坑都说一下。

    • 数据库时区

    数据库用的是 UTC+0 时区,但 ERP 客户端应用处理业务数据都是把时间当本地时间看的,也就是整个 ERP 系统的时间其实是错的,还不能去修正。

    • 长连接无法保持

    本来 Advanced Queue 是可以做成监听模式,但是我发现无法保持长连接,并且还不会报错!问了下才知道,服务器那边数据库实例随时可能会重启之类的。没办法,改成轮询模式,并且每次都主动打开关闭连接。因为简道云 API 的请求频率限制,性能影响这点可以忽略。

    • 部署到 Windows

    开始做的时候说了是要部署到 Linux,结果临交付了说要弄到 Windows 上。

    Windows 服务器(附带 360 全家桶)根本就没更新过,缺少 VC++ 库需要的补丁,安装不了 Python3.6 依赖的 VC++ 库,运行不了 Python3.6 !考虑直接使用系统更新功能需要安装的补丁太多,怕更新失败服务器就起不来,只能查补丁依赖列表,手动安装 VC++ 库需要的补丁。

    • 简道云 API 更新了

    准备验收结款了,简道云 API 更新了:doge:,不过不是兼容问题,只是增加了部门成员查询接口。最开始做的时候,随口说过的话把自己坑了——这个功能是 API 不支持,否则肯定给你们做。

    加了个部门成员信息定时同步到本地数据库的功能,然后我觉得反正做都做了,就再加了个企业微信通知推送报错信息,后面出问题好查一些。

    结果

    因为自己也觉得应该把之前的事情做完,预计 5 个工作日,不会很肝,所以报价 3000,最终交付完成总计 3 周(仅工作日)。

    超期的原因:

    1. 拯救艾泽拉斯
    2. 各个阶段交付时不能影响正在运行的业务,反馈需要有等待时间
    3. 需求变化
    4. 需求增加

    总结

    • 术士不配拯救艾泽拉斯(已 A )
    • 下次别给自己加戏了,吃饭要紧

    事后

    抽空重构了一个版本,加上了 SQL Server 的支持,不过总的来说实际意义不大,毕竟应用场景太小众,而收集分析数据 CDC 方式更合适。另外还可以 Message Queue 触发存储过程实现一些业务,或者单机实现异步执行存储过程,不过互联网应用应该是不存在对数据库编程强依赖的场景,依旧用处不大。

    不过如果你刚好有 SQL Server 或者 Oracle 需要通过数据库触发 API 之类的需求,还是可以参考一下的。

    https://github.com/TomCzHen/jiandaoyun_push_tool

    11 条回复    2019-05-13 23:10:49 +08:00
    lueffy
        1
    lueffy  
       2019-05-12 21:50:32 +08:00 via iPhone
    写得比我条理清晰的多了,手动点赞
    lueffy
        2
    lueffy  
       2019-05-12 21:52:31 +08:00 via iPhone
    拯救艾泽拉斯什么鬼,指打游戏?
    fy
        3
    fy  
       2019-05-12 22:35:11 +08:00
    拯救艾泽拉斯可还行,离开七年了,艾泽拉斯还好吗
    thechosenone
        4
    thechosenone  
       2019-05-12 22:40:54 +08:00
    预计 5 个工作日,最终交付完成总计 3 周,我先笑一会儿
    qbhy
        5
    qbhy  
       2019-05-13 09:24:12 +08:00
    Laravel Queue 生产环境用 redis 驱动,就不是轮询了
    whitehack
        6
    whitehack  
       2019-05-13 10:45:40 +08:00
    就业方便。拯救艾泽拉斯术士不能缺。
    websmallc
        7
    websmallc  
       2019-05-13 12:21:46 +08:00 via iPhone
    我第一次接私活是好多年前一个朋友的亲戚锁骨骨折,我从医院拿了两根钢丝,然后晚上在换药室找了个麻醉师,颈丛麻醉后捆了两根钢丝,一共给我 3000 块,麻醉师拿走 500,耗时一个小时
    v2qwsdcv
        8
    v2qwsdcv  
       2019-05-13 12:54:42 +08:00
    有没有 一起去台服拯救的,昨天刚建的台服号。对国服环境死心了
    tomczhen
        9
    tomczhen  
    OP
       2019-05-13 13:07:06 +08:00
    @thechosenone 主要原因还是打游戏、测试环境没权限,需要对方配合,但是对方也不是随时就有空。总的来说,还是没预估到沟通成本,单纯的开发用时还是在预期内。

    @qbhy 互联网那套不能直接用在传统 CS 程序直连数据库的情况,引入 Redis 会增加复杂度,使用数据库作为队列是评估各项需求和成本之后的最优选择。

    @websmallc 硬核。
    darlinghsu
        10
    darlinghsu  
       2019-05-13 13:17:49 +08:00
    我神牧也不配拯救 这个月过了就不续月卡了(以后有时间或许可以练个小德)
    baijd
        11
    baijd  
       2019-05-13 23:10:49 +08:00 via Android
    @websmallc 这是医学专业的?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1161 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:00 · PVG 07:00 · LAX 15:00 · JFK 18:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.