也来记录一下第一次接私活的体验 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
tomczhen
V2EX    程序员

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

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

    来源

    所在部门领导答应另一个部门领导解决业务上的一些问题,刚好是我负责。由于各总原因,没过试用期,领导需要我离职了,跟另一个部门领导确认后,就在离职前 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     Solana     5860 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 06:24 PVG 14:24 LAX 23:24 JFK 02:24
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86