一、背景

最初遇到这个问题是去58面试。部门领导是原同事,所以面试比较水。水到什么程度呢?

面试就是走个形式而已,不会不过的。

一面面试官就问了一个问题:“一个请求过来都经过了什么?”  剩下的全是闲聊。顺便展示一下公司和部门的优势。期待加入的意思。

声明

面试如此之松是基于两点:

第一点,与原同事多年的共事已经展示了能力和综合素质,比几个小时的面试得到的结论靠谱的多。

第二点,原同事本身认人识人的能力得到了其他人的认可,所以大家放心他推荐的人。

毕竟没人愿意让一个不合适的人加入自己团队拉低整体水准。

二、问题考察点

深度和广度的综合考察

三、静儿的答案

建立虚拟场景

☆ 项目

容器调度服务(根据用户传入的机房、CPU、内存等信息给用户创建所需要的机器)。

项目所用技术栈:SpringBoot、Thrift、缓存、mysql、k8s

☆ 需求

程序中需要用thrift(RPC调用)请求基础服务取所有的机房信息。

☆ 设计

基础服务提供了「傻瓜式」客户端给调用方。客户端只需要引入jar包,就可以像调用本地接口一样进行访问。

 

客户端实现方法

因为机房信息是低频的、对变更一定时延不敏感的资源信息。所以客户端首先RPC去远程取结果放到本地JVM缓存中。每次调用直接返回JVM缓存信息。客户端有定时任务定时将最新结果刷新到JVM缓存。

 

设计特点:

1、对thrift接口做封装,封装包括设定了远程获取异常的重试次数、重试间隔、远程服务信息等。原因:基础服务提供方自己最清楚自己服务的响应时间、服务可用性等信息,自己设置更为精确,避免对使用方造成困扰。

2、每次返回本地JVM存的机房信息。信息更新通过自带定时任务。原因:基础服务提供方自己最清楚自己的资源被更新频率如何,提供数据的实时性重要性如何。怎么保持数据一致性。怎样更高效。这些难题不应该抛给调用方。

3、懒加载处理。原因:不能因为jar包被引用就直接占用内存、CPU等资源。要按需提供。

服务端实现方法

服务端收到请求,考虑到这个是基础服务,使用方多。为了防止压力直接作用于数据库,上面加了一层集中式缓存。不穿透的情况下,直接返回缓存信息。

数据库中的所有机房信息是从k8s标签中获取过滤的。有变化直接刷缓存。即数据库中存的是所有的标签信息,其中一个小功能是从所有标签中过滤机房标签。这种设计是区别于有个机房管理系统录入这种管理,机房信息永远是实时准确的。(这块涉及到内部系统的设计问题,如果看不懂直接忽略即可。)

☆ 请求过来经过了什么

 

从程序设计上,大体经过的如上图。限于篇幅(如果你想了解不限于篇幅是个什么状态,可以阅读下面一篇《一个请求过来都经过了什么?(2017年http版)》),本篇不讲JVM经过了怎样的过程,主内存和工作内存交互,内存可能的分页,numa绑核、定频非定频等等。深度上只介绍thrift调用这一层。

 

笼统的过程如上图。大体分为三个部分:

1、有IP直接访问IP,没有IP通过其他信息获取到IP。

在此部分中,第一次连接需要根据环境和服务标识获取机器列表。客户端一般会有本地进程代理。对于美团OCTO来说,就是Sg_Agent(服务治理代理)。代理会和OCTO服务器进行通信,及时获取最新信息。连接建立后,下次访问就是直接IP访问了。

2、通过IP访问服务端,根据类名+方法签名获取方法。

3、通过拦截器认证的请求被服务端处理后返回结果。

Thrift内部的架构是分层次的。客户端和服务端都可大体分为代码层、协议层、传输层、IO处理层四部分。客户端和服务端的IO处理层直接交互。

 

代码层:

代码在美团OCTO体系中MtThrift中会直接由框架自动从java代码转成IDL文件,框架再根据IDL文件生成代码实现数据的读写。

协议层(实现Tprotocol接口):

将数据编码、解码。最三种的三种传输格式支持是:二进制格式、压缩格式、Json格式。

传输层(实现Ttransport接口):

提供从网络等媒介读取和写入数据的方式。常用的有:向文件进行读写、从内存上读写、压缩读写。

IO处理层:

这层所做的就是阻塞、非阻塞,单线程、多线程这些。一般像获取所有机房信息这样的读操作用的是多线程阻塞方式。写操作一般用多线程非阻塞方式。

再往下linux系统层的东西也是可以讲讲的,内容有点多,大家自己做思考题吧。还有涉及网络传输的信道、全双工传输模式这些,大家可以自己想一想,查一查。

四、总结

本次公众号文章共三篇《一个请求过来都经过了什么?(Thrift版)》《一个请求过来都经过了什么?(2017年http版)》《思维发散的双刃剑》。首篇是刚写的,第二篇是17年写的。最后一篇是一些总结思考。

一个请求过来都经过了什么?(Thrift版)的更多相关文章

  1. 对tomcat来说,每一个进来的请求(request)都需要一个线程,直到该请求结束。

    这段时间折腾了哈java web应用的压力测试,部署容器是tomcat 7.期间学到了蛮多散碎的知识点,及时梳理总结,构建良好且易理解的知识架构把它们组织起来,以备忘.对web应用开发者来说,我们很关 ...

  2. Nginx如何处理一个请求

    看了下nginx的官方文档,其中nginx如何处理一个请求讲解的很好,现在贴出来分享下.Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听 ...

  3. [转载]Nginx如何处理一个请求

    http://nginx.org/cn/docs/http/request_processing.html 对我的扫盲文章 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一 ...

  4. nginx js、css多个请求合并为一个请求(concat模块)

    模块介绍 mod_concat模块由淘宝开发,目前已经包含在tengine中,并且淘宝已经在使用这个nginx模块.不过塔暂时没有包含在nginx中.这个模块类似于apache中的modconcat. ...

  5. 每一个web开发者都应该了解的HTTP/2

    我认为每一个 web 开发者都应该对这个支撑了整个 Web 世界的 HTTP 协议有所了解,这样才能帮助你更好的完成开发任务.在这篇文章中,我将讨论什么是 HTTP,它是怎么产生的,它的地位,以及我们 ...

  6. SharePoint REST API - 一个请求批量操作

    博客地址:http://blog.csdn.net/FoxDave 本篇主要讲解如何应用$batch查询选项来批量执行REST/OData请求,它将多个操作捆绑到一个请求中,可以改进应用程序的性能 ...

  7. Spring MVC 原理探秘 - 一个请求的旅行过程

    1.简介 在前面的文章中,我较为详细的分析了 Spring IOC 和 AOP 部分的源码,并写成了文章.为了让我的 Spring 源码分析系列文章更为丰富一些,所以从本篇文章开始,我将来向大家介绍一 ...

  8. Netty 核心组件 Pipeline 源码分析(二)一个请求的 pipeline 之旅

    目录大纲: 前言 针对 Netty 例子源码做了哪些修改? 看 pipeline 是如何将数据送到自定义 handler 的 看 pipeline 是如何将数据从自定义 handler 送出的 总结 ...

  9. nginx学习笔记(7)Nginx如何处理一个请求---转载

    如何防止处理未定义主机名的请求基于域名和IP混合的虚拟主机一个简单PHP站点配置 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求.让我们从一个简单的配置(其中全部3个虚拟主机都在端口 ...

随机推荐

  1. 运用BT在centos下搭建一个博客论坛

    在日常的工作和学习中,我们都很希望有自己的工作站,就是自己的服务器,自己给自己搭建一个博客或者是论坛,用于自己来写博客和搭建网站论坛.现在我们就用一个简单的方法来教大家如何30分钟内部署一个博客网站. ...

  2. random.nextInt()与Math.random()基础用法

    相关文章:关于Random(47)与randon.nextInt(100)的区别 1.来源 random.nextInt() 为 java.util.Random类中的方法: Random类中还提供各 ...

  3. 让Tomcat告别频繁重启

    在网站开发过程中,有一个很烦的问题就是每次我们在项目里增加几行代码,然后我们企图在浏览器中查看修改后的变化时,却发现浏览器的内容并不变化,于是我们只能通过频繁的重启tomcat来获得最新的效果,其实这 ...

  4. .net core使用Apollo做统一配置管理

    做开发这么多年,经常因配置的问题引发生产环境的bug.有些年久的项目,几百个密密麻麻的配置项,经常容易搞混,有时好几个项目有好多同样的配置项,配置工作也不厌其烦.所幸,携程开源了新一代配置中心 - A ...

  5. SDOI2017 BZOJ 4820 硬币游戏 解题报告

    写在前面 此题网上存在大量题解,但本人太菜了,看了不下10篇均未看懂,只好自己冷静分析了.本文将严格详细地论述算法(避免一切意会和玄学),因此可能会比其它题解更加理论化一些,希望能对像我一样看了其它题 ...

  6. BZOJ_4867_[Ynoi2017]舌尖上的由乃_分块+dfs序

    BZOJ_4867_[Ynoi2017]舌尖上的由乃_分块+dfs序 Description 由乃为了吃到最传统最纯净的美食,决定亲自开垦一片菜园.现有一片空地,由乃已经规划n个地点准备种上蔬菜.最新 ...

  7. hibernate深度学习 游离状态 HQL

    当我学完这个之后 我仿佛都懂了 = =或许这就是 hibernate的力量吧. 操纵持久化对象(Session) 1.1. 在hibernate中java对象的状态 Hibernate 把对象分为 4 ...

  8. appium----【已解决】【Mac】安装sudo npm install -g appium-doctor总是提示“Error: EACCES: permission denied........”

    [mac电脑] 问题: (1)npm install -g appium-doctor    (2)sudo npm install -g appium-doctor (3)cnpm install ...

  9. 文本分布式表示(二):用tensorflow和word2vec训练词向量

    看了几天word2vec的理论,终于是懂了一些.理论部分我推荐以下几篇教程,有博客也有视频: 1.<word2vec中的数学原理>:http://www.cnblogs.com/pegho ...

  10. Docker最全教程——Redis容器化以及排行榜实战(十三)

    前言 容器教程的路还很长,笔者尽量根据实践来不断地完善.由于在编写的过程中还会有完善和补充,后续可能会以番外来补充. 接下来会分享TeamCity.树莓派等内容,节奏可能会有点跳脱. 另外,长沙.NE ...