首页 > 其他分享 >微服务划分的原则

微服务划分的原则

时间:2024-04-28 09:44:53浏览次数:15  
标签:事务 调用 服务 原则 划分 拆分 团队

服务划分

服务的合理划分是微服务成功的重中之重,是所有项目实施之前必须认真思考,严肃对待的。那么怎样划分才算是合理呢?

以业务、技术、团队导向规划服务

我们必须明确的是:服务不是越细越好,服务划分的第一要素是先以业务域水平拆分,再以技术视角垂直拆分,结合团队的规模、能力确定服务的个数与边界。这之中技术上的垂直拆分比较容易实现,但业务域的拆分可能会存在模糊边界,这时可以考虑结合领域模型来划分业务域。

以笔者的经验,在复杂的系统架构中领域驱动设计(DDD)中的领域模型是比较好的业务导向服务划分方案,下图是笔者服务公司的领域模型示例,可以很直观地明确划分边界。关于DDD可参见^Jdon网站。

 

另外团队的整体能力也是要考虑一个重要因素,一般而言团队的整体能力与服务的数量成正比,反之极容易导致架构失控。

DAG检查

DAG在数学是有向无环图,这里借用此定义表明:服务间不应该存在双向依赖,双向依赖会导致灾难性的后果。

 

上图是某项目改造前的服务依赖,存在很严重的双向依赖,直接导致了无法自动化部署、需求响应慢等诸多问题。一个设计精良的系统会做服务分层,业务在上,基础能力在下,上层调用下层服务,下层不依赖于上层,各服务间不在于相互依赖。

分布式事务检查

分布式事务的成本很高,服务拆分尽量避免产生跨服务事务,能合则合。如无法合并则优先考虑TCC或基于MQ的柔性事务,尽可能规避2PC等对性能影响很大的事务方案。TCC可完全替换2PC,但开发成本偏高,需要调用各方都同步修改以支持Try、Confirm和Cancel操作,某些场景会调用三方服务,其代码不受我们控制,此时可以考虑使用MQ实现异步消息和补偿性事务。

性能分布检查

服务中对于特别耗资源的操作应尽量独立。比如笔者的团队中曾有项目使用了bcrypt,导致系统注册服务的TPS严重下降,这时就应该考虑把这个签名比对独立成服务,为这一服务部署更多节点,并且可以为其独立购买计算优化型云主机。

稳定(易变)性检查

一个服务中如存在稳定和不稳定的模块,应该将两者拆分。

 

比如笔者曾经为某电信10000号做服务化改造,10000号子系统——客服支撑系统(Customer Support System)有很多诸如本月套餐使用情况、销售品、IVR信息、通话足迹、故障分析等功能块,各个功能块要求可以动态添加、修改,此时在设计会把其独立成Widget服务,它的变更不会影响kernel服务。

 

调用链检查

服务间调用有IO消耗且不宜追踪,应控制调用链路的长度。以笔者的经验,一般的项目在4层以内比较合适,比如:应用服务网关——>应用服务——>公共服务网关——>公共服务。

服务的划分是微服务成败的关键,实践时遵循上述原则的同时更要灵活机动,因地制宜。

标签:事务,调用,服务,原则,划分,拆分,团队
From: https://www.cnblogs.com/yanshanduyunxia/p/18163061

相关文章

  • 对象存储服务的图像处理特性
    AWSS3没有定义图像处理类的接口,但在官方文档中提供了文章使用AmazonS3对象Lambda在检索图像时动态添加水印,借助AmazonS3ObjectLambda由开发者自行实现相关的能力。技术方案作为兼容AWSS3能力的对象存储服务,交付图像处理特性时,关注点有:实现方式SDK独立进程部署......
  • 对象存储服务的事件通知特性
    AWSS3提供了事件通知的能力,即在客户应用访问对象存储时,对象存储服务可提供通知服务,支撑客户的特定应用场景,比如业务审计、计费等。相关能力可参考官方文档。相关API,如下:PutBucketNotificationGetBucketNotificationPutBucketNotificationConfigurationGetBucketNotificati......
  • 对象存储服务的元数据检索特性
    依据AWSS3的AmazonS3RESTAPIIntroduction,当前提供的对象列举接口,如下:ListObjectVersionsListObjectsListObjectsV2上述接口仅支持使用前缀、对象版本作为检索条件,在业务交付时使用非常不方便。为提供类似Everything的检索能力,可以参考ECSDataAccessGuide3.5.0.2中......
  • 服务器远程管理
    一、两种类型1、远程桌面(PING通了,在把服务器的远程管理打开就行)   必须是服务器上的远程桌面用户组里的用户才会有权限2、telnet(命令行的形式) 查看本地所有已开放的端口号  ......
  • 对象存储服务中对象业务的非标接口
    本文中讨论的对象存储服务及接口,主要和AWSS3对标。AWSS3提供的对象存储业务,与传统的POSIX规范相比,舍弃了很多特性,比如:文件类型硬链接软链接目录文件相关的操作追加写随机写截断修改名称目录相关的操作创建目录修改名称删除目录元数据时间crtime即......
  • Go语言高并发与微服务实战专题精讲——远程过程调用 RPC——优化RPC调用,缓解频繁请求
    远程过程调用RPC——优化RPC调用,缓解频繁请求导致的GC压力 在Go语言的高并发和微服务架构中,远程过程调用(RPC)是一种常用的通信机制。然而,当频繁发送RPC请求时,不断创建Request和Response结构体可能会带来额外的垃圾收集(GC)压力,进而影响应用的性能和响应时间。为了减......
  • Go语言高并发与微服务实战专题精讲——远程过程调用 RPC——客户端处理RPC请求的原理
    远程过程调用RPC——客户端处理RPC请求的原理及源代码分析 客户端无论是同步调用还是异步调用,每次RPC请求都会生成一个Call对象,并使用seq作为key保存在map中,服务端返回响应值时再根据响应值中的seq从map中取出Call,进行相应处理。 客户端发起RPC调用的过程大致如下所示,我们......
  • ROS学习-启动服务端错误debug
    ros2runexamples_rclpy_minimal_serviceservice输入这个命令用于运行服务节点,这个服务的功能是将两个数字相加,给定a,b两个数,返回sum也就是ab之和。报错:2024-04-2713:11:39.105[RTPS_TRANSPORT_SHMError]Failedinit_portfastrtps_port7412:open_and_lock_filefailed->......
  • 微服务想缓存一些数据,不希望重复调用。java SoftReference软引用存储缓存
    背景:微服务我们要调用字典数据,但是很多都是要重复调用的,没有缓存,我为了设置一个应用的缓存,并且可以定时清理,更新 首先定义两个静态数据,。一个软连接缓存,一个定时清理线程privatestaticSoftReference<Map<String,Map<String,DictionaryVo>>>plmDicMapCache=newSoftR......
  • 关于ida f5时报错lumina无法连接到云服务器的问题
    在用ida的时候不知道怎么回事突然就f5不了了,报错 Decompilationfailure:4005F7:cloud:ServerisnotavailablePleaserefertothemanualtofindappropriateactions lumina:connect:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。4005F......