前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一种跨环境Tars调用的实现思路

一种跨环境Tars调用的实现思路

原创
作者头像
claudeliang
修改于 2019-08-26 03:10:10
修改于 2019-08-26 03:10:10
1.1K0
举报
文章被收录于专栏:奔跑的老肥羊奔跑的老肥羊

导语

Tars是腾讯开源的高性能RPC开发框架,详细介绍见Tars框架介绍。跨环境Tars调用的需求(两个不同系统,或两个不同环境系统的打通)时有发生,本文提供的是一种在不同Tars环境间,让服务可以通过registry互相调用的思路。既满足跨环境Tars调用的需求,又不失去Tars框架自带的服务发现、服务路由负载均衡功能,并尽可能减少对业务代码的侵入。

Tars服务交互

这里我简单的总结概述一下服务的交互流程如下:

tars.png
tars.png
  • 用户在web管理平台上发布服务,上传发布包至patch服务,并通过registry服务下发发布命令至具体节点的node服务上,node服务负责拉起server并定期将server的心跳转发给registry服务,由registry服务来统一维护服务的路由和管理
  • 当客户段服务client调用server时,client通过obj名字到registry服务拉取server的可用ip端口信息,然后根据ip端口信息以tcp或udp的方式访问server
  • Tars还支持一种直连模式,client通过在obj名字后@ip端口信息来调用server,此时client会忽略obj名字也不会去registry服务查询,直接通过写死的ip端口来进行服务调用

实现思路

要实现跨环境Tars调用,容易想到以下两种思路:

  • 通过上面说到的直连模式调用
  • 与Tars框架无关,被调方开放web接口供调用方访问

这两种思路分别存在一些问题:

  • 通过直连模式调用,就失去了通过registry服务路由的能力,设想一下被调方的server迁移了节点ip端口发生了变化,而调用方不知道,就会发生调用异常影响服务的使用
  • 被调方提供web接口,则需要被调方侵入业务代码进行服务提供方式的改造,相应的调用方的调用方式也要进行改造

这里我们的方案是将上述两种思路结合起来,如图:

tars2.jpg
tars2.jpg
  • client调用server_obj@proxy_client的ip端口,这样会走直连模式请求到proxy_client代理服务,这里clientproxy_client都是调用方自己部署的服务,走直连也是相对可控的
  • proxy_client通过https的方式访问proxy_server域名,同时带上client请求时的obj名等信息,这里被调方只要保持域名接口不变,内部服务可自由迁移
  • proxy_server在收到请求后,通过obj名字查询环境2的registry服务,然后进行服务调用,这时无论server如何迁移都可以通过registry服务来进行路由
  • 整个调用过程clientserver都无须改动一行代码,只需要在client端配置调用obj名字时@上代理的地址即可

结语

本文中的方案最初是在笔者所在腾讯某内部服务上云时使用,来满足IDC机房和云机房间不同环境间的服务调用。当前实现的初衷是满足不同环境Tars服务间的调用,但我想无论是什么框架思路是相通的,希望能在你遇到类似场景时,给你提供一些灵感😊。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spark Drive 端的 List 无法获取 Executor 中的数据吗?
好久没有写 Spark 相关的代码了,结果写了一个如下类似的代码,在 drive 端 new 了一个 arrayList,然后再 Executor 端进行 add 操作,最后再在 drive 端打印 这个 list .size。结果发现这个 size 为0,顿时好奇心就上来了。
shengjk1
2025/05/16
560
【Spark数仓项目】需求三:地图位置解析进一步优化
因为全部调用高德API会造成高并发的问题,超出高德的调用规范,这也解释了为什么前面需求二我们只查找毕导用户。因此,在不给高德充钱的前提下,我们采用维表+高德api调用少数可以继续进行优化。
火之高兴
2024/07/25
1120
【Spark数仓项目】需求三:地图位置解析进一步优化
Spark 如何使用累加器Accumulator
Accumulator 是 spark 提供的累加器,累加器可以用来实现计数器(如在 MapReduce 中)或者求和。Spark 本身支持数字类型的累加器,程序员可以添加对新类型的支持。
smartsi
2019/08/07
2.9K0
Spark Core快速入门系列(12) | 变量与累加器问题
  正常情况下, 传递给 Spark 算子(比如: map, reduce 等)的函数都是在远程的集群节点上执行, 函数中用到的所有变量都是独立的拷贝.
不温卜火
2020/10/28
5580
Spark Core快速入门系列(12) |  变量与累加器问题
Spark Core项目实战 | Top10 热门品类
本实战项目的数据是采集自电商的用户行为数据. 主要包含用户的 4 种行为: 搜索, 点击, 下单和支付. 数据格式如下, 不同的字段使用下划线分割开_:
大数据真好玩
2020/09/04
1.2K0
Spark学习笔记——共享变量
通常,当传递给Spark操作(例如map or reduce)的函数在远程集群节点上执行时,它可以在函数中使用的所有变量的单独副本上工作。这些变量被复制到每个机器,并且远程机器上的变量的更新都不会被传播回到驱动程序。在任务之间支持一般的,读写共享变量将是低效的。然而,Spark 为两种常用的使用模式提供了两种有限类型的共享变量:广播变量和累加器。
挖掘大数据
2018/01/19
1.2K0
spark源码系列之累加器实现机制及自定义累加器
一,基本概念 累加器是Spark的一种变量,顾名思义该变量只能增加。有以下特点: 1,累加器只能在Driver端构建及并只能是Driver读取结果,Task只能累加。 2,累加器不会改变Spark L
Spark学习技巧
2018/01/30
2.4K0
spark源码系列之累加器实现机制及自定义累加器
2021年大数据Spark(十九):Spark Core的​​​​​​​共享变量
在默认情况下,当Spark在集群的多个不同节点的多个任务上并行运行一个函数时,它会把函数中涉及到的每个变量,在每个任务上都生成一个副本。但是,有时候需要在多个任务之间共享变量,或者在任务(Task)和任务控制节点(Driver Program)之间共享变量。
Lansonli
2021/10/09
5850
Spark Core源码精读计划4 | SparkContext提供的其他功能
前面两篇文章一直在讲SparkContext初始化的内部逻辑,除此之外,它也对外提供一部分其他功能,我们挑选几个主要的来简要了解。SparkContext还有一个伴生对象,里面涉及到一些SparkContext创建的内部机制。
大数据真好玩
2019/08/08
5190
大数据技术之_19_Spark学习_02_Spark Core 应用解析+ RDD 概念 + RDD 编程 + 键值对 RDD + 数据读取与保存主要方式 + RDD 编程进阶 + Spark Cor
  我们需要一个效率非常快,且能够支持迭代计算和有效数据共享的模型,Spark 应运而生。RDD 是基于工作集的工作模式,更多的是面向工作流。   但是无论是 MR 还是 RDD 都应该具有类似位置感知、容错和负载均衡等特性。
黑泽君
2019/05/10
2.5K0
大数据技术之_19_Spark学习_02_Spark Core 应用解析+ RDD 概念 + RDD 编程 + 键值对 RDD + 数据读取与保存主要方式 + RDD 编程进阶 + Spark Cor
Spark2.3.0 共享变量
通常情况下,传递给 Spark 操作(例如 map 或 reduce)的函数是在远程集群节点上执行的,函数中使用的变量,在多个节点上执行时是同一变量的多个副本。这些变量被拷贝到每台机器上,并且在远程机器上对变量的更新不会回传给驱动程序。在任务之间支持通用的,可读写的共享变量是效率是非常低的。所以,Spark 提供了两种类型的共享变量 : 广播变量(broadcast variables)和 累加器(accumulators)。
smartsi
2019/08/07
1.1K0
大数据技术之_27_电商平台数据分析项目_02_预备知识 + Scala + Spark Core + Spark SQL + Spark Streaming + Java 对象池
List 元素的追加 方式1-在列表的最后增加数据 方式2-在列表的最前面增加数据
黑泽君
2019/06/14
2.8K0
大数据技术之_27_电商平台数据分析项目_02_预备知识 + Scala + Spark Core + Spark SQL + Spark Streaming + Java 对象池
Spark Core项目实战(1) | 准备数据与计算Top10 热门品类(附完整项目代码及注释)
  本实战项目的数据是采集自电商的用户行为数据.   主要包含用户的 4 种行为: 搜索, 点击, 下单和支付.   数据格式如下, 不同的字段使用下划线分割开_:
不温卜火
2020/10/28
1.1K0
Spark Core项目实战(1) | 准备数据与计算Top10 热门品类(附完整项目代码及注释)
大数据技术之_19_Spark学习_02_Spark Core 应用解析小结
1、RDD 全称 弹性分布式数据集 Resilient Distributed Dataset 它就是一个 class。
黑泽君
2019/04/27
6980
Apache Spark 2.2.0 中文文档 - Spark 编程指南 | ApacheCN
本文介绍了 Apache Spark 的 RDD 程序设计指南,从 RDD 的基本概念、创建与操作、缓存与存储、性能优化等方面进行了详细阐述,并提供了丰富的实例和代码以帮助读者更好地理解和掌握 RDD 的使用方法。
片刻
2018/01/05
1.7K0
Apache Spark 2.2.0 中文文档 - Spark 编程指南 | ApacheCN
Spark踩坑记:共享变量
本文主要介绍了如何在Spark中通过共享变量和广播变量来提高数据处理效率和处理速度。作者通过实例介绍了共享变量和广播变量的使用方法,包括使用方式、注意事项以及示例代码。同时,作者还针对广播变量的更新难易程度提出了一种解决方案。该方案可以有效地解决广播变量更新困难的问题,在每天千万级的数据实时流统计中表现稳定。
肖力涛
2017/04/19
3.6K0
Spark踩坑记:共享变量
Spark自定义累加器的实现
Spark自定义累加器的实现 Java版本: package com.luoxuehuan.sparkproject.spark; import org.apache.spark.AccumulatorParam; /** * * @author lxh * implements AccumulatorParam<String> * String格式 进行分布式计算 * 也可以用自己的model ,但必须是可以序列化的! * 然后基于这种特殊的数据格式,可以实现自己复杂的分布式计算逻辑
Albert陈凯
2018/04/04
1.9K0
❤️Spark的关键技术回顾,持续更新!【推荐收藏加关注】❤️
集群环境:CDH版本是5.14.0这个版本 但由于spark对应的5.14.0的CDH版本的软件默认的版本是1.6.0同时阉割了SarkSQL,需要重新编译 原因: 因为Cloudera公司认为有了impala就不需要再使用sparkSQL的功能了,同时也是为了推广impala,所以直接阉割掉了sparkSQL的模块。 解决: 使用Apache的版本的spark来进行重新编译
Lansonli
2021/10/11
5190
Spark中累加器的陷阱
累加器(Accumulator)是Spark提供的累加器,顾名思义,该变量只能够增加。由Driver端进行初始变量,Task再对声明的变量进行累加操作。
俺也想起舞
2019/11/27
9920
Spark 累加器与广播变量
在 Spark 中,提供了两种类型的共享变量:累加器 (accumulator) 与广播变量 (broadcast variable):
每天进步一点点
2022/07/27
7990
Spark 累加器与广播变量
推荐阅读
相关推荐
Spark Drive 端的 List 无法获取 Executor 中的数据吗?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档