热门标签 | 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社区在“七牛弯区课堂”的处女作。欢迎各技术社区的小伙伴来【七牛弯区课堂】分享实践心得,也感谢各位为技术社区所贡献的力量。


推荐阅读
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 本文详细介绍了MySQL数据库的基础语法与核心操作,涵盖从基础概念到具体应用的多个方面。首先,文章从基础知识入手,逐步深入到创建和修改数据表的操作。接着,详细讲解了如何进行数据的插入、更新与删除。在查询部分,不仅介绍了DISTINCT和LIMIT的使用方法,还探讨了排序、过滤和通配符的应用。此外,文章还涵盖了计算字段以及多种函数的使用,包括文本处理、日期和时间处理及数值处理等。通过这些内容,读者可以全面掌握MySQL数据库的核心操作技巧。 ... [详细]
  • 本文深入解析了 Kubernetes 控制平面(特别是 API 服务器)与集群节点之间的通信机制,并对其通信路径进行了详细分类。旨在帮助用户更好地理解和定制其安装配置,从而增强网络安全性,确保集群的稳定运行。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 深入解析Android GPS机制:第五部分 ... [详细]
  • Hyperledger Fabric 1.4 节点 SDK 快速入门指南
    本文将详细介绍如何利用 Hyperledger Fabric 1.4 的 Node.js SDK 开发应用程序。通过最新版本的 Fabric Node.js SDK,开发者可以更高效地构建和部署基于区块链的应用,实现数据的安全共享和交易处理。文章将涵盖环境配置、SDK 安装、示例代码以及常见问题的解决方法,帮助读者快速上手并掌握核心功能。 ... [详细]
  • 本文全面解析了 Python 中字符串处理的常用操作与技巧。首先介绍了如何通过 `s.strip()`, `s.lstrip()` 和 `s.rstrip()` 方法去除字符串中的空格和特殊符号。接着,详细讲解了字符串复制的方法,包括使用 `sStr1 = sStr2` 进行简单的赋值复制。此外,还探讨了字符串连接、分割、替换等高级操作,并提供了丰富的示例代码,帮助读者深入理解和掌握这些实用技巧。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 本指南详细介绍了在Linux环境中高效连接MySQL数据库的方法。用户可以通过安装并使用`mysql`客户端工具来实现本地连接,具体命令为:`mysql -u 用户名 -p 密码 -h 主机`。例如,使用管理员账户连接本地MySQL服务器的命令为:`mysql -u root -p pass`。此外,还提供了多种配置优化建议,以确保连接过程更加稳定和高效。 ... [详细]
  • 本文全面解析了 gRPC 的基础知识与高级应用,从 helloworld.proto 文件入手,详细阐述了如何定义服务接口。例如,`Greeter` 服务中的 `SayHello` 方法,该方法在客户端和服务器端的消息交互中起到了关键作用。通过实例代码,读者可以深入了解 gRPC 的工作原理及其在实际项目中的应用。 ... [详细]
  • HBase客户端Table类中getRpcTimeout方法的应用与编程实例解析 ... [详细]
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社区 版权所有