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

【七牛弯区课堂】Ruby服务间通信模式

Ruby是计算机语言中的绅士,如果要用一个词来形容,那一定是优雅,有这么一位Rubyist,他的座右铭是“写优雅的程序,做一个优雅的人”,他是来自七牛小伙伴“薄荷”的Co-founder兼CTO谢文威(英文名Vincent)。薄荷的核心系统完全基于Ruby构建,关于Ruby服务间通信模式,他在“七牛弯区课堂”给Ruby爱好者们做了一次分享。

【七牛弯区课堂】Ruby服务间通信模式

上图是薄荷App服务划分的例子,各子系统(服务)间需要进行各种通信,主要通信种类如下。

一、A服务需要使用B服务的一些数据 共享数据库

应用场景:用户的年龄、性别、身高和体重等数据存储在账号子系统中,其它子系统经常需要使用这些数据。

处理方式:共享数据库

【七牛弯区课堂】Ruby服务间通信模式

App2直接建立连接访问 App1的数据库。这种方式的优点是性能较好,避免了接口处理和消息封装种种开销,适用于通信特别频繁或者数据量特别大的场合。薄荷的账号和会话数据即采取这种方案。但是,该方式导致服务间有很强的耦合,App2对App1的数据结构有紧密的依赖,导致App1的实现难以变更。

共享数据库方法:

ActiveRecord支持多数据库配置有一些注意的事项:
可以使用关联,不支持join,不支持事务
测试数据最好使用factory_girl
为避免数据混乱,只有一个服务可写

共享模型使用
gem model
git submodule

二、A服务需要B服务提供某个计算结果 请求结果(同步)

应用场景:计算预算热量需要使用复杂的数学模型,它放在记录子系统中实现,别的系统需要用到相关的数据时,通过一种通信机制拿到计算结果。

处理方式:HttpAPI Call和RPC

1)Http API Call

【七牛弯区课堂】Ruby服务间通信模式

这是最常见的一种通信方式,服务实现方案成熟可靠,具有服务边际简单清晰的特点,同时适用于外部和内部,但内部调用性能不够好。

使用Http API注意事项
访问安全控制,使用ip限制,token校验等
避免调用层次过深,超时机制
Http Client选择(Http Client特别多,主要分为以下几类)

【七牛弯区课堂】Ruby服务间通信模式

薄荷目前typhoeus和faraday用的较多,原因是:typhoeus底层基于curl,性能比较好,并且支持并行,用异步API的方式,比较可靠,不用担心多线程问题。

【七牛弯区课堂】Ruby服务间通信模式
2)RPC(Remote Procedure Call)

主要特点:
长连接,避免每次通信创建网络连接,性能较好
对http、消息协议更高效
多种跨语言RPC方案,如thriftmsgpack_rpc
RPC管理
性能上有一定优势,需要权衡其复杂度,复杂度在于服务实现方案和管理方法。
服务端并发模式
高可用方案,可用HAProxy
平滑部署

RPC的用法比较少见,更多地用于跨多语言的团队,当公司使用多种语言且需要很好地整合时,RPC则是一种比较成熟的方案。

三、A服务需要B服务处理一项任务 请求任务处理(异步)

应用场景:在购物模块里面,一个订单发生支付后,需要给用户推送一些信息,比如发短信、邮件和手机推送等。发送消息可能需要比较长的时间才能完成,请求方不需要等待处理结果。

处理方式:消息队列

1)传统消息队列系统RabbitMQ/Active MQ
MQ可以有降低服务之间耦合度,通常用于服务之间的异步处理(传统MQ有更丰富的处理机制),传统MQ ruby服务实现方案,可以参考sneakers, hutch, rack-ampq, rack-rabbit。
2)在单个应用内部常常使用基于redis的轻量消息队列
resque&sidekiq
3)sidekiq-postman

它是Vincent写的一个gem,基于sidekiq轻量消息队列解决方法,简单实用,可以跨应用请求sidekiq任务处理,以下是其核心代码:

【七牛弯区课堂】Ruby服务间通信模式

四、A服务发生某件事,通知B和C进行处理 订阅和通知

应用场景:比如账号基本信息,基于性能考虑,在子系统中存储了用户名副本。当用户名在账户子系统中发生变化时,需要通知其它子系统更新。

处理方式:消息队列

【七牛弯区课堂】Ruby服务间通信模式

Sidekiq-driver 是Vincent正在写的基于sidekiq轻量订阅和通知解决方法的gem,大家可以尽情期待这个项目的开源。

【七牛弯区课堂】Ruby服务间通信模式

【七牛弯区课堂】是七牛为广大开发者提供的技术实践分享课堂,后续将定期邀请各技术社区的专家进行分享。以上内容即是Ruby China社区在“七牛弯区课堂”的处女作。欢迎各技术社区的小伙伴来【七牛弯区课堂】分享实践心得,也感谢各位为技术社区所贡献的力量。


推荐阅读
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 三、查看Linux版本查看系统版本信息的命令:lsb_release-a[root@localhost~]#lsb_release-aLSBVersion::co ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • Docker安装Rabbitmq(配合宝塔)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Docker安装Rabbitmq(配合宝塔)相关的知识,希望对你有一定的参考价值。一、事前准备 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 14亿人的大项目,腾讯云数据库拿下!
    全国人 ... [详细]
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社区 版权所有