某公司.Net架构师面试题(2)

值类型与引用类型


 1、理解参数按值传递?以及按引用传递?
按值传递:对于值类型传递的它的值拷贝副本,而引用类型传递的是引用变量的内存地址,他们还是指向的同一个对象。
按引用传递:通过关键字out和ref传递参数的内存地址,值类型和引用类型的效果是相同的。


2、out 和 ref的区别与相同点?
out 和 ref都指示编译器传递参数地址,在行为上是相同的;
他们的使用机制稍有不同,ref要求参数在使用之前要显式初始化,out要在方法内部初始化;
out 和 ref不可以重载,就是不能定义Method(ref int a)和Method(out int a)这样的重载,从编译角度看,二者的实质是相同的,只是使用时有区别;

3、说说值类型和引用类型的生命周期?
值类型在作用域结束后释放。

引用类型由GC垃圾回收期回收。

4、static 构造函数什么时候执行?其中的代码逻辑是否是线程安全?
静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。
安全。


GC与内存管理 


1、简述一下一个引用对象的生命周期?
一个对象的生命周期简单概括就是:创建>使用>释放,在.NET中一个对象的生命周期:

new创建对象并分配内存
对象初始化
对象操作、使用
资源清理(非托管资源)
GC垃圾回收

2、using() 语法是如何确保对象资源被释放的?如果内部出现异常依然会释放资源吗?
using() 只是一种语法形式,其本质还是try…finally的结构,可以保证Dispose始终会被执行。

3、NET中的托管堆中是否可能出现内存泄露的现象?
是的,可能会。比如:

不正确的使用静态字段,导致大量数据无法被GC释放;
没有正确执行Dispose(),非托管资源没有得到释放;
不正确的使用终结器Finalize(),导致无法正常释放资源;
其他不正确的引用,导致大量托管对象无法被GC释放;


多线程编程与线程同步

1.Task和Thread的区别?

Task的背后的实现也是使用了线程池线程,但它的性能优于ThreadPoll,因为它使用的不是线程池的全局队列,而是使用的本地队列,使线程之间的资源竞争减少。同时Task提供了丰富的API来管理线程、控制。但是相对前面的两种耗内存,Task依赖于CPU对于多核的CPU性能远超前两者,单核的CPU三者的性能没什么差别。简单地说,thread是单核多线程,task是多核多线程。

2、线程池的优点有哪些?又有哪些不足?
线程池的优点

1)降低资源消耗,避免线程的创建和销毁带来的性能开销。

2)提高响应速度,当任务来时可以直接使用,不用等待线程创建
3)避免大量的线程间因互相抢占系统资源导致的阻塞现象。
4}提高线程的可管理性。
线程池缺点
1.适用于生存周期较短的的任务,不适用于又长又大的任务。

2.线程池所有线程都处于多线程单元中,如果想把线程放到单线程单元中,线程池就废掉了。

3.如果想标识线程的各个状态,比如启动线程,终止线程,那么线程池就不能完成这些工作。

4.不能对于线程池中任务设置优先级。

5.对于任意给定的应用程序域,只能允许一个线程池与之对应。

3、在多线程情况下,如何防止线程安全性问题,列举几种方式?
解决线程安全问题的一种方案:使用同步代码块
解决线程安全问题:同步方法
同步方法:使用synchronized修饰的方法,就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法外等着。
解决线程安全同步第三种方式:Lock锁


缓存


1.Redis 有哪几种常用的数据类型?分别的功能?

一共五种

(一)String
这个其实没啥好说的,最常规的set/get操做,value能够是String也能够是数字。通常作一些复杂的计数功能的缓存。

(二)hash
这里value存放的是结构化的对象,比较方便的就是操做其中的某个字段。博主在作单点登陆的时候,就是用这种数据结构存储用户信息,以cookieId做为key,设置30分钟为缓存过时时间,能很好的模拟出相似session的效果。

(三)list
使用List的数据结构,能够作简单的消息队列的功能。另外还有一个就是,能够利用lrange命令,作基于redis的分页功能,性能极佳,用户体验好。本人还用一个场景,很合适—取行情信息。就也是个生产者和消费者的场景。LIST能够很好的完成排队,先进先出的原则。

(四)set
由于set堆放的是一堆不重复值的集合。因此能够作全局去重的功能。为何不用JVM自带的Set进行去重?由于咱们的系统通常都是集群部署,使用JVM自带的Set,比较麻烦,难道为了一个作一个全局去重,再起一个公共服务,太麻烦了。
另外,就是利用交集、并集、差集等操做,能够计算共同喜爱,所有的喜爱,本身独有的喜爱等功能。

(五)sorted set
sorted set多了一个权重参数score,集合中的元素可以按score进行排列。能够作排行榜应用,取TOP N操做

2.使用Redis时需要注意哪些方面的问题?(开放性题目)

一)缓存和数据库双写一致性问题

(二)缓存雪崩问题

(三)缓存击穿问题

(四)缓存的并发竞争问题

3.如何保证缓存和数据库中的数据的一致性?(开发性题目)

分析:一致性问题是分布式常见问题,还可以再分为最终一致性和强一致性。数据库和缓存双写,就必然会存在不一致的问题。答这个问题,先明白一个前提。就是如果对数据有强一致性要求,不能放缓存。我们所做的一切,只能保证最终一致性。另外,我们所做的方案其实从根本上来说,只能说降低不一致发生的概率,无法完全避免。因此,有强一致性要求的数据,不能放缓存。

首先,采取正确更新策略,先更新数据库,再删缓存。其次,因为可能存在删除缓存失败的问题,提供一个补偿措施即可,例如利用消息队列。

网络
1.如果发现服务器中的句柄数或者TCP链接数过高,如何定位问题,相关步骤?(开发性题目)
一、可能是磁盘空间满啦,请求一直未处理,出现请求堆积,导致服务器连接数过高

二、LVS,不支持rewrite跳转,即RS(realserver)跳转到LVS(负载均衡)

三、进程数开启的太少啦,处理不过来页面请求


数据库


1、什么时候需要数据分表或者分库?描述下分库分表的实现方式。
分表和分库是根据业务情况而定的,一般在数据规模非常大的情况下需要进行拆分,一个表或者一个数据库无法支撑那么大的并发和数据规模就需要拆分

可以分为两种方式:垂直(纵向)切分和水平(横向)切分。


高可用/高性能
1.描述下常用的负载均衡策略算法和特点

1、轮询
将所有请求,依次分发到每台服务器上,适合服务器硬件相同的场景。
优点:服务器请求数目相同;

缺点:服务器压力不一样,不适合服务器配置不同的情况;

2、随机
请求随机分配到各台服务器上。
优点:使用简单;

缺点:不适合机器配置不同的场景

3、最少链接
将请求分配到连接数最少的服务器上(目前处理请求最少的服务器)。
优点:根据服务器当前的请求处理情况,动态分配;

缺点:算法实现相对复杂,需要监控服务器请求连接数;

4、Hash(源地址散列)
根据IP地址进行Hash计算,得到IP地址。
优点:将来自同一IP地址的请求,同一会话期内,转发到相同的服务器;实现会话粘滞。

缺点:目标服务器宕机后,会话会丢失;

5、加权
在轮询,随机,最少链接,Hash等算法的基础上,通过加权的方式,进行负载服务器分配。

优点:根据权重,调节转发服务器的请求数目;

缺点:使用相对复杂;


2.为什么使用消息队列?常用的如消息队列RabbitMQ 和kafka都有什么优点和缺点,自适合哪些使用场景?

解耦、异步、削峰。kafka适合数据量大的场景,rabbitmq适合可靠,对速度要求不高的场景

 

3.如何保证消息不重复推送和重复消费?设计思路

让每个消息携带一个全局的唯一ID,即可保证消息的幂等性,具体消费过程为:

1.消费者获取到消息后先根据id去查询redis/db是否存在该消息
2.如果不存在,则正常消费,消费完毕后写入redis/db
3.如果存在,则证明消息被消费过,直接丢弃。


扩展

 

1、系统如何实现水平扩展,如解决高并发问题,解决方案思路

水平扩展:利用Nginx建立分布式系统,增加服务器,增加CPU
解决高并发问题:增加缓存、禁止用户重复操作、建立请求队列

2、在微服务的架构下,如何处理解决事务一致性问题?解决思路
两阶段提交(2PC),三阶段提交(3PC)补偿事务(TCC)本地消息表(消息队列)Sagas事务模型(最终一致性)

3、列举一个曾经主导开发设计的项目,简要描述项目需求,并画一个技术架构图

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值