前文导读:

《都在说微服务,那么微服务的反模式和陷阱是什么(一)》

《都在说微服务,那么微服务的反模式和陷阱是什么(二)》

九、通信协议使用的陷阱

在微服务架构体系中要求每个服务都是独立布署,这就意味着服务之间会有通信,也就是说会有很多的远程访问。

当你不知道这些远程访问需要多长时间的时候,就会掉入到这个陷阱,当然我们可以假定远程访问一次50毫秒,但我们是否真正的进行过测试呢?那么服务的平均响应时间是多少呢?即使有看上去很好的平均响应时间,那么糟糕的“长尾延迟”也会将整体系统摧毁。

9.1 延迟测量

在生产环境中进行压力测试,是检测我们系统性能的重要手段之一,举个例子:我们有一个特定业务需要四个服务来协调处理,假如远程访问一次的时间是100毫秒,那么这个特定业务就需要消耗500毫秒(初始请求+四个服务的调用时间),这个只是远程访问的时间,还不算实际业务代码的执行时间,这是大多数应用系统都不能接受的时间。

9.2 通信协议比较

不同协议的延迟响应时间其实在不同的环境中表现的差异很大,因此我们也需要在不同的业务请求下建立一些测试基准。

从图9-1中可以看出AMQP的性能要比REST的快近一倍,可以我们就可以做出一些选择了,在什么场景下应该用什么协议,另外在选择协议时性能并不是唯一的考虑因素,在第十章将会为大家介绍除了性能还需要考虑的点是什么。

十、REST陷阱

目前使用REST协议已然成了微服务协议的最佳选择了,现在最流行的DropWizard和Spring boot就是基于REST进行通信的,那问题来了,如果REST是一个最佳选择,那为什么又说它是一个陷阱呢?如果把REST作为唯一的通讯方式,就有可能掉入这个陷阱,比如如何处理异步通讯(http 1.1是blocking的)、如何在一个事务中管理多次服务调用?如何支持广播?

你应该考虑两种类型的消息标准作为微服务架构中的消息传递:特定平台的标准和平台无关的标准。特定平台的标准比如 JMS for java、MSMQ for .net。平台无关的比如 AMQP。

使用消息系统的好处可以异步请求,还可以实现广播的方式,还可以实现事务请求。

10.1 异步请求

使用微服务架构首先要考虑的是异步通信方式,因为异步通信的调用者不需要考虑等待服务的响应时间,如图10-1所示。

使用异步方式的好处不仅提升了整体性能,还增加了一些可靠性的因素,另外也不需要担心超时问题和在程序中设置断路器模式。

10.2 广播能力

这个最典型的就是消息的“发布-订阅”,如图10-2所示。

10.3 事务请求

消息系统需要支持事务消息的概念,这意味着如果消息被发送到多个队列或Topic中,在发送方对该事务进行提交之前, 这些消息实际上不会被接收方所接收。服务消费者发送一个消息到第一个服务,然后发送另一个消息的第二个服务,如图10-3所示。在服务使用者执行提交之前,这些消息都保存在队列中。一旦服务使用者执行提交,两个消息就会被释放。

在图10-3中,服务消费者将消息发送到第一个队列中,然后服务消费者业务报错, 这时可以在消息事务中进行回滚,从消息系统的队列中删除掉刚才发的消息。

使用REST实现这种事务能力就非常困难,其实就是要求服务使用者使用TCC、或者补偿方式来达到最终一致性。

结束语

关于微服务的反模式和陷阱三部曲,到现在为止已经全部翻译完成,英文文档一共60多页,这里面有不少内容大家都是耳熟能详的,关于原版的英文文档我也提供给大家做一个参考,最后感谢大家的支持和帮助。

原版文档链接如下:http://pan.baidu.com/s/1qY3Etoo 密码:l26d

推荐阅读

  • Spring Boot & Spring Cloud 应用内存管理

  • Why Spring Boot

  • IoC与AOP的那点事儿

  • 数据异构的武器:BINLOG+MQ

  • 秒杀系统解决方案

  • 10分钟让你明白MySQL是如何利用索引的

  • 程序员你为什么这么累?

  • 我的编码习惯 - 接口定义

  • 我的编码习惯 - Controller规范

  • 我的编码习惯 - 日志建议

  • 我的编码习惯 - 异常处理

  • 我的编码习惯 - 参数校验和国际化规范

  • 我的编码习惯 - 函数编写建议

长按指纹

一键关注



都在说微服务,那么微服务的反模式和陷阱是什么(三)相关推荐

  1. 都在说微服务,那么微服务的反模式和陷阱是什么(二)

    译者:程超 译文:http://www.jianshu.com/p/c76f7f234a31 上篇:<都在说微服务,那么微服务的反模式和陷阱是什么(一)> 六.无因的开发者陷阱 名字来自詹 ...

  2. 都在说微服务,那么微服务的反模式和陷阱是什么(一)

    译者:程超 译文:http://www.jianshu.com/p/3986239138fe 中文目录 1.数据驱动的迁移反模式 1.1.太多的数据迁移 1.2.功能分割优先,数据迁移最后 2.超时反 ...

  3. 微服务设计 10 大反模式和陷阱

    数据驱动迁移反模式(Data-Driven Migration) ​ 如上图所示,此种反模式的问题在于微服务的粒度没有最终确定之前就做了数据迁移,如此当不断的调整服务粒度时,那么数据库就免不了频繁迁移 ...

  4. 03 | 微服务反模式与陷阱:代码共享反模式

    译者简介:ASCE1885, <Android 高级进阶>作者. 本文首发于Source Code Chain开发者社区,欢迎使用我的专属邀请链接加入一起交流. 微服务被称为"无 ...

  5. rpc框架都有哪些_这六种微服务RPC框架,你知道几个?

    开源 RPC 框架有哪些呢? 一类是跟某种特定语言平台绑定的,另一类是与语言无关即跨语言平台的. 跟语言平台绑定的开源 RPC 框架主要有下面几种. Dubbo:国内最早开源的 RPC 框架,由阿里巴 ...

  6. 单体仓库与多仓库都有哪些优势劣势,微服务选择哪种方案比较好?

    这段时间在研究bilibili泄露出来的源码,发现bilibili虽然使用了微服务的设计理念但是所有服务都是放在同一个仓库底下的,而我司和bilibili恰恰相反,我司所有项目都是分开独立的,也出现了 ...

  7. 大家都在谈的SOA和微服务 你真的理解吗

    微服务是什么? 微服务是一种架构设计模式.在微服务架构中,业务逻辑被拆分成一系列小而松散耦合的分布式组件,共同构成了较大的应用.每个组件都被称为微服务,而每个微服务都在整体架构中执行着单独的任务,或负 ...

  8. 两个server 两个数据库 微服务_微服务的数据库设计

    单独的数据库: 微服务设计的一个关键是数据库设计,基本原则是每个服务都有自己单独的数据库,而且只有微服务本身可以访问这个数据库.它是基于下面三个原因. 优化服务接口:微服务之间的接口越小越好,最好只有 ...

  9. 应用量化时代 | 微服务架构的服务治理之路

    技术随业务而生,业务载技术而行. 近些年来,伴随数字经济的发展,在众多企业的数字化转型之路上,云原生.DevOps.微服务.服务治理等成为行业内不断被探讨的新话题.人们在理解和接受这些新型概念的同时, ...

最新文章

  1. HDUOJ-------单词数
  2. 5G UPF + MEC 的部署位置、场景与模式
  3. TCP/IP详解--第十六章
  4. python csv 中文乱码_python读写csv时中文乱码问题解决办法
  5. Android官方开发文档Training系列课程中文版:高效显示位图之在UI中展示位图
  6. 易乐游无盘服务器缓存设置,易乐游缓存设置图文教程
  7. node express创建项目步骤
  8. TensorFlow 2.0和PyTorch谁更好?大牛们争了好几天
  9. 用ICC编译MP3编码器LAME
  10. 网赚在线之Cashfiesta公司网上赚钱全攻略
  11. 2013年十大免费空间综合排行榜-稳定,可靠,速度快,可建站免费空间
  12. 安卓投屏软件_免费领取15天懒人听书会员+安卓美食菜谱整合app+安卓乐播投屏+办公软件幕布405天免费领取...
  13. Gavin老师Transformer直播课感悟 - BERT多任务Fine-tuning案例实战
  14. 浅谈进程地址空间与虚拟存储空间
  15. GNS模拟linux,GNS3模拟器官方版最新版及安装说明
  16. 如何禁止百度自动转码?
  17. PaddlePaddle入门-1
  18. mysql plsql 语法_PL/SQL基本语法
  19. Kaggle赛题解析:Google手语识别
  20. java jtable 排序_解决JTable排序问题的方法详解

热门文章

  1. rtp 多媒体流同步控制 实时传输协议 简介
  2. linux user 用户管理
  3. VC6中编译参数设置
  4. 新一代 Linux 文件系统 btrfs 简介
  5. 用php生成html文件,怎样用PHP生成html文件
  6. mysql could not create connection_mysql8.0 Could not create connection to database server.解决办法...
  7. 云南大学计算机网络原理,云南大学软件学院计算机网络原理期中试卷王世普.doc...
  8. c语言map作为参数传递,C++中map和vector作形参时如何给定默认参数?
  9. 虚拟机克隆_了解Java中的可克隆接口
  10. mysql删除root用户密码_MySQL忘记密码 或者误删除root用户有效解决办法