最近看到两条关于35岁程序员的消息,挺有意思的
对于程序员来讲,中年危机是一个永远都不能避开的话题。
其实解决方法也很简单:建议35岁退休!
哈哈,开个玩笑。
虽然这是评论区一个抖机灵的回答,但也是一条可以努力奋斗的路径。
尤其是这几年做公众号之后,认识了很多自由职业者,其中不乏一些超级个体,他们根本就没有中年危机。
因为他们早就脱离了打工人的生活,自己为自己工作。
应对中年危机的建议
提升技能 :不断学习新技能和知识,特别是那些能够帮助你在职业生涯中取得突破的技能。
在主业上一定不能懈怠,对程序员来讲,最容易赚钱的方式就是上班。
保持对工作的热情和动力,通过调整工作状态、寻找新的工作挑战等方式,克服职业倦怠。
优化收入结构 :努力提高专业技能和综合素质,提高收入水平。
如果主业稳定了,并且很难再获得提升,那就要考虑建立第二收入来源。
关注多元化收入来源,如兼职、投资等。
8小时内谋生存,8小时外谋发展,对于普通人来讲,唯一的机会就是多尝试,多试错。
拓展人际关系 :建立广泛的职业网络,不仅可以提供新的工作机会,还能让你获得更多的信息差。
如果30岁之后,你还只能通过在招聘网站投简历找工作,那真的挺惨的。
你的前同事,你的朋友,居然没人内推你?
程序员也不能只埋头搞技术。
以上都是开源的建议,接下来轮到节流了。
控制支出,合理消费 :树立正确的消费观念,合理规划消费,避免不必要的浪费。
建立紧急储备基金 :设立应急基金,以备不时之需,来应对紧急支出或收入下降的情况。
如果以上你能做的事情都做了,大概率面对中年危机时能更从容。
剩下的也就只有 保持积极心态 了,不焦虑,就已经超过绝大多数人了。
--------------------下面是今天的面试题 --------------------
面试题:说说你对RPC框架的理解?
RPC (Remote Procedure Call)即远程过程调用,是分布式系统常见的一种通信方法。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。
除 RPC 之外,常见的多系统数据交互方案还有分布式消息队列、HTTP 请求调用、数据库和分布式缓存等。
其中 RPC 和 HTTP 调用是没有经过中间件的,它们是端到端系统的直接数据交互。
通俗点说
RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。
RPC会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯)。
客户端发起请求,服务器返回响应(类似于Http的工作方式)RPC在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。
追问1:RPC框架实现原理是什么样的
在RPC框架中主要有三个角色:提供者、消费者和注册中心。如下图所示:
提供者: 暴露服务的服务提供方。
提供者: 调用远程服务的服务消费方。
注册中心: 服务注册与发现的注册中心。
原理图如上,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
比如说,A服务器想调用B服务器上的一个方法:Employee getEmployeeByName(String fullName)
RPC整个调用过程,主要经历如下几个步骤:
1、建立通信
首先要解决通讯的问题:即A机器想要调用B机器,首先得建立起通信连接。
主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。
2、服务寻址
要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么。
通常情况下我们需要提供B机器(主机名或IP地址)以及特定的端口,然后指定调用的方法或者函数的名称以及入参出参等信息,这样才能完成服务的一个调用。
可靠的寻址方式(主要是提供服务的发现)是RPC的实现基石,比如可以采用redis或者zookeeper来注册服务等等。
从服务提供者的角度看:当提供者服务启动时,需要自动向注册中心注册服务;
当提供者服务停止时,需要向注册中心注销服务;
提供者需要定时向注册中心发送心跳,一段时间未收到来自提供者的心跳后,认为提供者已经停止服务,从注册中心上摘取掉对应的服务。
从调用者的角度看:调用者启动时订阅注册中心的消息并从注册中心获取提供者的地址;
当有提供者上线或者下线时,注册中心会告知到调用者;
调用者下线时,取消订阅。
3、网络传输
序列化
当A机器上的应用发起一个RPC调用时,调用方法和其入参等信息需要通过底层的网络协议如TCP传输到B机器,由于网络协议是基于二进制的,所有我们传输的参数数据都需要先进行序列化( Serialize )或者编组(marshal)成二进制的形式才能在网络中进行传输。然后通过寻址操作和网络传输将序列化或者编组之后的二进制数据发送给B机器。
反序列化
当B机器接收到A机器的应用发来的请求之后,又需要对接收到的参数等信息进行反序列化操作(序列化的逆操作),即将二进制信息恢复为内存中的表达方式,然后再找到对应的方法(寻址的一部分)进行本地调用(一般是通过生成代理Proxy去调用,
通常会有JDK动态代理、CGLIB动态代理、Javassist生成字节码技术等),之后得到调用的返回值。
4、服务调用
B机器进行本地调用(通过代理Proxy)之后得到了返回值,此时还需要再把返回值发送回A机器,同样也需要经过序列化操作,然后再经过网络传输将二进制数据发送回A机器,而当A机器接收到这些返回值之后,则再次进行反序列化操作,恢复为内存中的表达方式,最后再交给A机器上的应用进行相关处理(一般是业务逻辑处理操作)。
·END·
IT交流群
组建了程序员,架构师,IT从业者交流群,以
交流技术
、
职位内推
、
行业探讨
为主
加小编 好友 ,备注"加群"