本地缓存时效性较短,可能只有十多秒钟,但对于商品信息的这种延时,业务端能接受,只要保障在一分钟之内后台修改前端生效即可。
10、对于消息监听的聚合处理,具体怎么做的来避免聚合过程中出现数据丢失?如果聚合过程中出现性能瓶颈,有哪些具体的优化策略?
关于消息的监听和聚合处理以避免数据丢失,有多种方案。在当前场景下,一种是针对聚合直接通过 redis 的 Key 去重,即发过来消费时写到里面,若存在则不写,十秒钟过期;还有一种是将消息直接写入本地队列,队列每隔一定时间去消费一次,这也是一种聚合方式。针对 redis 的聚合方式不存在丢失情况,而对于本单机的聚合,在发生 GC 或重启时可能会丢失,这种丢失可能会有一些影响,在某些对时效性要求不高、一致性要求也不高的场景下,会采用这种方式并进行一些处理。
11、商品库存没有sku的概念吗?库存放在redis里,扣减库存不存在事务问题吗?
现在整个库存已细化到具体的库存单元,一个库存单元可能对应一个具体库存,可能是总库存或日库存。放入库存时按照库存类型,要么放总的,要么放每一天的。使用时,如门票场景,不管是总减总库存还是按日期使用,若按分签,客户对应那一天的库存即可。扣减库存时会有事务问题,除扣减总库存数量外,还需插入一条扣减明细,用于后续追溯整个扣减过程。扣减这两个操作,即更新和插入扣减明细在一个事务中,而扣减实际是异步的。
12、对于 API 性能监控,具体监控哪些指标能够更准确地反映系统的性能问题?如何根据这些指标进行性能优化?
这个问题较大,抽取几个重点说明。在开发过程中,平时遇到问题最多的可能是 API 性能变慢。性能变慢不一定有风险隐患,比如从 100 毫秒变为 120 毫秒可能是因上了新业务新功能。保障系统可用性分为两类,一是针对接口性能,如 KPS 性能、平均耗时、接口 95 线等做定期指标采集,每周采集核心接口性能指标,若有变慢则分析原因并优化,使其回到以前水平。二是隐患相关问题,若接口性能在正常水平如 100 毫秒但偶尔波动为 1 秒或 2 秒,需重点关注分析波动原因,对于导致性能波动的子指标如慢查询、线程波动、redis 的大 K 和热 K 等分成多个运行时子指标,与 API 系统一样做采集监控,每周在周会或 review 系统健康状态时关注优化,识别出有明显风险的隐患并定期治理,使其成为日常工作。稳定性不能仅靠压测时发现风险,要把常见问题总结出的可能导致问题的点监控起来定期优化。
13、海外项目代码和国内是一套代码吗,配置隔离的方式?基础设施的SDK和平台是一套还是两套代码?
我们目前都是一套代码,部署时携程国内和海外虽为不同 group 和机房,国内可能多机房,海外也可能多机房,但各自进行对应的 DR 部署,若一个地方出现故障,另一个地方能承载对应流量。基础设施目前也是一套,会有一些针对环境的适配。
14、优化左移有什么业务场景的例子吗?设计阶段也不好预测上线后发生的问题啊?如何预测风险的?
优化左移常见情况如线程池波动,个别团队可能对线程监控不足。如单核线程在 100 左右为健康水平,但有些应用每周波动大,可能因突增流量或业务代码中执行某段代码时多线程使用不合理,在节假日或秒杀场景下可能导致单机故障,恢复麻烦。在开发和运行过程中,每周对比指标,识别有问题的点。设计阶段有两个常见问题,一是降级场景保障事务一致性,如写数据库失败可能导致两张表数据不一致,生产上此失败场景概率小,但流量大或服务负载不健康时易出现,秒杀场景问题会被放大。预测风险方面较难做到,应提前识别风险隐患并优化,若平时不关注整理则不知有何风险,将问题找出并优化后,在节假日或大量场景下对系统质量更有信心。
15、活动前持续性压测如何做的?
和大家都差不多。主要分为两类,一类是单个应用的压测,对某一系统或模块进行压测,先确定目标,如单机及集群要达到何种水平,因很多场景下涉及集群及数据库容量上限问题,为达到五一、十一等几倍目标,各应用应提前做压测确定水平。单应用压测后进行集成压测,从前端用户视角以入口流量放大倍数往底层压测,目前与其他公司相比某些场景未做到位,如影子库或影子流量隔离场景,部分已做,部分正在进行中,现在压测可能因多个集群和机房,将流量切到另一机房进行安全压测。
16、redis集群选型为什么选用redis cluster?基于什么考虑的?
整个公司的选型,目前已统一按照标准处理。作为业务方共同决策,具体历史背景不太清楚。现在大家使用常见的选型,目前没什么大问题,且比之前的要好很多。
17、redis的集群高可用性携程是如何做的?
现在携程分多个机房,每个机房有一主多从的架构,即一个 master 对应多个 slave,且在多个机房部署。若其中一个机房挂了,访问时会将流量均衡到其他机房。
18、请问因为延迟,海外部署一套集群,redis是两套吗?海外和国内票数不一致吗?
在当前场景下,其他场景中数据是隔离的,如商品信息等可能存在不一致场景时,可通过 DRC 同步。但对于库存场景,目前未进行拆分,扣库存场景仍在国内同一地方进行,不存在数据不一致问题。后续若海外业务与国内业务存在差异,可能会对这块进行拆分。
19、扣减Redis后 写队列的分布式事务也没有针对性处理吗 ?是靠监控来发现异常的吗?
刚提到的扣减及分布式事务,正常消费消息并非分布式事务,扣减后消息发出,消费消息时针对消息进行扣减操作,如扣减库存服务扣减成功,在扣减服务中对数据库表操作有事务处理,要么成功要么失败,若失败会多次重试,仍未成功则靠监控发现并加入监控中。