美团服务体验平台对接业务数据的最佳实践-海盗中间件

海盗:服务体验平台的智能数据编排
为解决美团服务体验平台面对海量业务场景的数据对接难题,介绍了一种名为'海盗'的智能数据编排中间件。海盗通过定义DSL(领域特定语言)实现服务编排,支持并行和串行调用,简化了客服侧RD工作,提高了业务数据的复用性和领域划分清晰度。

背景

移动互联网时代,用户体验为王。美团服务体验平台希望能够帮助客户解决在选、购、用美团产品过程中遇到的各种问题,真正做到“以客户为中心”,为客户排忧解难。但服务体验平台内部只维护客户的客诉数据,为了精准地预判和更好地解决客户遇到的问题,系统必须依赖业务部门提供的一些业务数据,包括但不限于订单数据、退款数据、产品数据等等。 本文会着重讲一下在整个系统交互过程中遇到的一些问题,然后分享一下在实践中探索出来的经验和方法论,希望能够给大家带来一些启发。

问题

对接场景广而杂

首先,需要接入服务体验平台服务(包括直接面向用户的C端服务、面向客服的工单服务等等)的业务方非常多且杂,而且在不断拓展。美团有非常多的业务线,比如外卖、酒店、旅游、打车、交通、到店餐饮、到店综合、猫眼等等。其中部分业务又延展出多条子业务线,比如大交通部门包含火车票、汽车票、国内机票、国际机票、船票等等。具体到每一条子业务线的每一个业务场景,客户都有可能会遇到问题。对于这些场景,服务体验平台服务都需要调用对应的业务数据接口,来帮助用户自助或者客服协助解决这些问题。就美团现有的业务而言,这样的场景数量会达到万级。而且业务形态在不断迭代,还会有更多的场景被挖掘出来,这些都需要持续对接更多的业务数据来进行支撑。

接入场景定制化要求高

其次,接入服务体验平台服务的业务方定制化要求很高。因为业务场景的差异化非常大,不同的接入方都希望能够定制特殊复杂逻辑,需要服务体验平台提供的服务解决方案与业务深度耦合。这就需要服务体验平台侧对接入方业务逻辑和数据接口深入了解,并对这些业务数据进行组装,针对每个场景进行定制开发。

方案

早期方案

为了解决上述问题,初期在做系统设计时候,考虑业务方多是既有系统,所以服务体验平台服务趋向平台化设计,并引入了适配层。服务体验平台内部对所有的业务数据和逻辑进行统一抽象,对内标准化接口,屏蔽掉业务逻辑和接口的差异。所有的定制化逻辑都在适配层中封装。但这需要客服侧RD对所有的场景去编写适配器代码,将从一个或者多个业务部门接口中拿到的业务数据,转成内部实际场景需要的数据。

其系统交互如下图所示:

缺点

虽然上述系统设计能满足业务上的要求,但是存在两个比较明显的缺点。

编码工作量繁重

如上图所示,每个业务场景都需要编写适配器来满足需求,如果依赖的外部接口比较少,场景也比较单一,按照上述方案实施还可以接受。但业务接入非常多且杂,给客服侧RD带来了非常繁重的工作量,包括适配器编写以及后续维护过程中对下游业务接口的持续跟踪和监控。

客服侧RD需要深入了解业务方逻辑

另外,由于客服侧RD对于业务模型的不熟悉,解析业务模型然后组装最终展示给客户的数据,需要比业务方RD花更多的时间来梳理和实现,并且花费更多的时间来验证正确性。比如下面是一个真实的组装业务接口并对业务数据进行处理的案例:

public class TicketAdapterServiceImpl implements OrderAdapterService {

    @Resource(name = "tradeQueryClient")
    private TradeTicketQueryClient tradeTicketQueryClient;
    @Resource
    private ColumbusTicketService columbusTicketService;

    /** 
    * 根据订单ID获取门票相关的订单数据、门票数据、退款数据等
    **/
    @Override
    public OrderInfoDTO handle(OrderRequestDTO orderRequestDTO) {
        List<ITradeTicketQueryService.TradeDetailField> tradeDetailFieldList = new ArrayList<ITradeTicketQueryService.TradeDetailField>();
        tradeDetailFieldList.add(ITradeTicketQueryService.TradeDetailField.ORDER);
        tradeDetailFieldList.add(ITradeTicketQueryService.TradeDetailField.TICKET);
        tradeDetailFieldList.add(ITradeTicketQueryService.TradeDetailField.REFUND_REQUEST);
        try {
            //通过接口A得到部分订单数据、门票数据和退款数据
            RichOrderDetail richOrderDetail = tradeTicketQueryClient.getRichOrderDetailById(orderRequestDTO.getOrder
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值