连锁当家运维手册


kafka消息队列方案

<p>两个软件: 1 pos 2 crm </p> <p><strong>六个场景:</strong></p> <ol> <li>pos开卡,数据传给crm 2.crm开卡,数据传给pos;pos再通过场景1,把开卡结果给crm</li> <li>pos 会员A积分+300 </li> <li>crm 积分兑换 会员A积分-200 5.crm发券给pos 6.pos使用券核销后给crm <strong>一个主题:</strong> topic: pos_crm_dcr (初期只有一个主题pos_crm_xxxxx,通过消息的一个参数来区分)</li> </ol> <p><strong>一个消息处理服务简称mps:</strong> 消息处理程序: 每个服务对应一个第三方应用, 这个是方便针对不同的第三方api进行调试和更新)</p> <p><strong>一个订阅关系:</strong> crm 订阅所有的需要处理的消息, topic:pos_crm_dcr </p> <p><strong>三个对外接口api</strong> 采用类似api实时写数据库方式 1.开卡/修改卡资料(此接口需要异步回调crm) 2.积分变化 3.发优惠券</p> <p>关于生产者的描述 1.pos的业务处理php代码中,根据系统的配置文件的参数决定是否发送消息到kafka; 至于哪个租户需要这个信息,是由消费者决定的,不是由生产者决定,生产者不知道消费者是谁; 2.消息的生产者中要包含生产者的id;这样是未来防止消息被生产者再次重复消费; 3.消息的body中要包含唯一id;大部分是唯一单号或者流水号;目的是支持幂等调用;</p> <p>处理方式描述: 1 pos开卡 -》调用RPC api(有现成的api) -》成功后,由现在的api写入kafka的topic的队列(需修改现有api)-&gt; kafka自动推送消息到已经订阅开卡topic对应crm服务(例如驿氪)-crm服务接收到消息,根据消息体中的id来区分是什么业务;-》通过crm开放的restful方式的开卡接口-》成功调用根据返回值写入日志, 成功分为 A接口调用成功(接口不成功,先放入失败队列,根据配置循环会持续调用3次) B业务逻辑成功(标记成功,业务逻辑失败,比如卡号重复,写入监控日志,通知管理员微信并发送日志链接;) 2 crm开卡 -》调用pos开放的restful api,根据影响的数据行数反馈给crm -》pos根据传来参数判断是开卡还是修改资料-》调用pos开卡逻辑(由pos开卡程序给crm数据同步);</p> <p>3 pos 会员A+积分300 -&gt; 调用RPC api(有现成的api) 更新积分到数据库 -》成功后写入kafka的topic的队列(需修改现有api)-&gt; kafka自动推送消息到已经订阅topic对应crm服务(例如驿氪)-crm服务接收到消息,根据消息体中的id来区分是什么业务;-》通过crm开放的restful方式的积分流水接口-》成功调用根据返回值写如日志,</p> <p>4 crm 会员A在crm做积分兑换 会员A积分-200 -》 调用rest 开放api(需新增api) ,-》 开放api调用现有的RPC接口更新积分 -》现有增加或者减少积分的api接口处理,根据影响的数据行数反馈给crm</p> <ol> <li>crm发券给pos 6.pos的券核销后给crm</li> </ol> <p>讨论的问题以及初步方案如下:</p> <p>1 接口调用失败怎么处理(目前采用计入失败队列,然后定时持续3次调用,) 2 开放给外部第三方的restapi需要支持幂等调用;防止数据重复; 3 pos调用crm的appid和sercet 和crm调用pos的相同 4 所有的店铺无论是否开通crm;开卡都上传给crm;已经开通crm的店铺可以关闭pos开卡功能; 5 本地pos可以配置,是否开通kafka</p>

页面列表

ITEM_HTML