热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

rpc调用设计经验.md

rpc服务设计经验:http:www.infoq.comcnpresentationssystem-stability-and-optimization-from-soa-plan

rpc服务设计

  • 经验:http://www.infoq.com/cn/presentations/system-stability-and-optimization-from-soa-planning-and-managemen

包的划分

  • xxx-api : api给调用方使用

  • xxx-core:业务实现 【具体可以再分吧】

  • xxx-job: 任务

  • xxx-web :部署 maven profile环境【没有统一的配置中心】

接口设计原则:

异常区分

  • rpc框架异常

  • 系统异常

  • 业务异常

接口设计

  • 业务成功

  • 是否重试 【rpc框架配置】

  • 异常处理

基于dubbo的问题

A服务–> B服务

  • 中间网络异常:访问超时

  • B服务宕机:访问超时

  • B服务rpc框架异常:抛出rpc框架异常

  • B服务系统异常:内部异常或者业务异常

dubbo服务为例,默认重试2次,如果有多个提供值默认随机选另外一个,重试之内在调不通调用b服务跑出RpcException,如果配置上mock降级,返回null,看业务

dubbo服务化最佳实战

  • 分包: api,core,web; 建议将服务接口,服务模型,服务异常等均放在API包中

  • 粒度:服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,否则将面临分布式事务问题,

服务分为:原子服务(订单的crud等),核心(业务)服务,只做查询的查询服务等,接口 入参 出参 要明确 拒绝:Map query(Map)

  • 版本:每个接口都应该有版本号

  • 兼容性: 服务接口增加方法,或服务模型增加字段,可向后兼容(删除方法或删除字段,将不兼容,枚举类型新增字段也不兼容,需通过变更版本号升级)

  • 异常:处理RpcException框架异常,其他的不建议跑出异常,建议定义 code和msg描述问题,查找问题的时候在b服务的机器上面查询,异常带来反序列化等性能问题,

RpcException问题看业务A—->B—>C,业务场景是否可以降级等

  • 服务的配置尽量在服务提供者方面配置完善,考虑该服务相关问题

接口方法的是否重试,并发量,超时时间,是否mock, 复杂均衡策略,失效转移策略,综合接口是查询,幂等等考虑

  • 分布式服务中,所有的服务都可能不可靠,对一个服务内的 调用确保一个服务 的相关业务

  • 服务级别:细粒度服务提供数据操作,不涉及业务的基础服务,以及业务聚合服务,避免分布式事务

分布式rpc调用分析

电商常用的 优惠券,订单服务, 支付服务

  • 流程:

《rpc调用设计经验.md》 Paste_Image.png

三个独立的服务,单独的db库;先来考虑下单的服务调用

  • 下单之前用户必然要先选择优惠券,所以下单之前要调用扣减优惠券走rpc调用(失败到此结果提示扣减优惠券失败),调用成功走用户下单流程

  • 如果下单失败,必然要回滚扣掉的优惠券,怎么操作?走rpc添加优惠券,如果此时优惠券服务超时了就添加不成功了

这里可以利用,消息队列的特性(保证消息至少成功消费一次),发一条添加刚才扣掉的优惠券消息

  • 如果下单成功,就去支付,而此时支付成功但是返回结果的时候失败了?如何处理?一般此时的订单就在支付中的状态

支付失败,提示支付失败即可

  • 分布式rpc调用三种状态: 失败,成功, 超时(可能成功可能失败需要特别思考)

分布式调用

非实时、非强一致性

  • 走mq消息实现方式:同时做好防止重复消费,幂等性等

实时,强一致性

  • 参考蘑菇街创建订单流程

《rpc调用设计经验.md》 Paste_Image.png

  • 将分布式事务,分解成多个本地事务,然后结合mq回滚

  • 先创建一个状态为:不可见的订单,锁定优惠券(失败)发送废单消息

  • 锁定优惠券成功,扣减库存(失败),也发送 废单消息

  • 扣减库存成功修改订单为可见状态

  • 只要是 废单消息 消息(回库存,回劵劵等)


推荐阅读
  • 一面自我介绍对象相等的判断,equals方法实现。可以简单描述挫折,并说明自己如何克服,最终有哪些收获。职业规划表明自己决心,首先自己不准备继续求学了,必须招工作了。希望去哪 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • Python开源库和第三方包的常用框架及库
    本文介绍了Python开源库和第三方包中常用的框架和库,包括Django、CubicWeb等。同时还整理了GitHub中最受欢迎的15个Python开源框架,涵盖了事件I/O、OLAP、Web开发、高性能网络通信、测试和爬虫等领域。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 浅析对象 VO、DTO、DO、PO 概念
    作者|CatQi链接|cnblogs.comqixuejiap4390086.html前言由于此订阅号换了个皮肤,导致用户接受文章不及时。读者可以打开订阅号「Web项 ... [详细]
  • mapreduce源码分析总结
    这篇文章总结的非常到位,故而转之一MapReduce概述MapReduce是一个用于大规模数据处理的分布式计算模型,它最初是由Google工程师设计并实现的ÿ ... [详细]
  • 1、概述首先和大家一起回顾一下Java消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:然后在另一篇博客《Java消息队列-ActiveMq实战》中 ... [详细]
  • SOA架构理解理解SOA架构,了解ESB概念,明白SOA与微服务的区别和联系,了解SOA与热门技术的结合与应用。1、面向服务的架构SOASOA(ServiceOrien ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • ElasticSerach初探第一篇认识ES+环境搭建+简单MySQL数据同步+SpringBoot整合ES
    一、认识ElasticSearch是一个基于Lucene的开源搜索引擎,通过简单的RESTfulAPI来隐藏Lucene的复杂性。全文搜索,分析系统&# ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
author-avatar
我爱技术交流
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有