腾讯一面 SNG 腾讯云 安全运营开发

腾讯一面 SNG 腾讯云 安全运营开发

1. 自我介绍

2. 介绍项目

3. nginx反向代理的服务器宕机的怎么办?

nginx会根据预先设置的权重转发请求,若给某一台服务器转发请求时,达到默认超时时间未响应,则再向另一台服务器转发请求。我们可以自己修改默认超时时间。虽然这种方式简便、成本低廉。但缺点是:可靠性低和负载分配不均衡。适用于图片服务器集群和纯静态页面服务器集群。

有比nginx更好的分布式方案:zookeeper。

衍生问题:nginx服务器宕机的怎么办?

Nginx+keepalived 高可用双机热备(主从模式/双主模式):https://blog.csdn.net/u012599988/article/details/82152224

4. 如何做到一个真正的负载均衡,做到服务注册与发现?

什么是服务注册与服务发现

服务注册,就是将提供某个服务的模块信息(通常是这个服务的ip和端口)注册到1个公共的组件上去(比如: zookeeper\consul)。

服务发现,就是新注册的这个服务模块能够及时的被其他调用者发现。不管是服务新增和服务删减都能实现自动发现。

服务注册与服务发现涉及到了SpringCloud、微服务的范畴。

服务注册和发现原理

服务注册和发现的基本流程如下图所示:

image.png

首先,在服务启动时,服务提供者会向注册中心注册服务,暴露自己的地址和端口等,注册中心会更新服务列表。服务消费者启动时会向注册中心请求可用的服务地址,并且在本地缓存一份提供者列表,这样在注册中心宕机时仍然可以正常调用服务。

如果提供者集群发生变更,注册中心会将变更推送给服务消费者,更新可用的服务地址列表。

目前市面上已经有了服务注册和服务发现的解决方案,代表作是:zookeeperconsul以及etcd

img

zookeeper地址

https://blog.csdn.net/jiahao1186/article/details/82633588

Eureka

在 Spring Cloud 中,提供了 Eureka 来实现服务发现功能。Eureka 采用的是 Server 和 Client 的模式进行设计,Eureka Server 扮演了服务注册中心的角色,为 Client 提供服务注册和发现的功能。

Eureka Client 通过客户端注册的方式暴露服务,通过注解等方式嵌入到服务提供者的代码中,当服务启动时,服务发现组件会向注册中心注册自身提供的服务,并周期性地发送心跳来更新服务。

image.png

如果连续多次心跳不能够发现服务,那么 Eureka Server 就会将这个服务节点从服务注册表中移除,各个服务之间会通过注册中心的注册信息来实现调用。

Euerka 在 Spring Cloud 中广泛应用,目前社区中集成的是 1.0 版本,在后续的版本更新中,Netflix 宣布 Euerka 2.0 闭源,于是开源社区中也出现了许多新的服务发现组件,比如 Spring Cloud Alibaba Nacos。

5. nginx如何实现动静分离?

答:我将前端静态资源部署在本地磁盘中,当浏览器的static请求访问nginx时,让nginx去读取本地磁盘中的静态文件。当浏览器的static请求访问nginx时,nginx转发对应的请求到对应服务器的

在我们的软件开发中,有些请求是需要后台处理的(如:.jsp,.do 等等),有些请求是不需要经过后台处理的(如:css、html、jpg、js 等等文件),这些不需要经过后台处理的文件称为静态文件,否则动态文件。

因此我们后台处理忽略静态文件。这会有人又说那我后台忽略静态文件不就完了吗?当然这是可以的,但是这样后台的请求次数就明显增多了。在我们对资源的响应速度有要求的时候,我们应该使用这种动静分离的策略去解决动、静分离将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问

6. 处理高并发的手段有哪些

1.入口流量分发,软件硬件分发

常见的nginx代理负载均衡,lvs虚拟ip流量分发,以及F5硬件负载均衡

nginx负载均衡实际上是使用http代理来实现的,流量是先进入nginx服务器,然后请求后方应用服务器,应用服务器返回数据给nginx,nginx再输出给用户
nginx负载均衡效果大部分取决于nginx服务器的性能,一般能应付一万左右并发量

lvs 除了DR模式性能比较好之外,其他模式性能并没很大提高,其主要实现原理是修改请求报文(网络4层)中的mac地址,将请求发送到真实服务器
lvs 与RS服务器必须在同一个网段内才能实现最好的效果,并且无法感知RS服务器是否正常访问
通常使用lvs负载到nginx服务器,nginx服务器能获取应用的可用状态,从而实现高可用

2.页面静态化,前端CDN缓存

对于一些更新不是很频繁的页面,可用通过运维人员设置的定期计划任务,生成静态页面,然后提交到nginx服务器上,让nginx去处理静态请求
前端js,css,images等资源打包,实现前后端分离,并按照hash定义为版本号,放置到cdn缓存服务器上,加快处理与响应速度,减少应用服务器负担

3.服务切分,应用集群

将业务拆分成多个服务,并按照服务的负载量来伸缩部署应用,负载高的就部署多一些,在特殊情况下,可用关闭一些不重要的服务来维持主要业务的处理

4.消息队列,任务队列

应对突发高并发情况,任务不能立即处理完成,此时建立消息队列,有专门的服务处理这些队列,完成后再通知应用服务器,应用服务器再返回结果给用户

5.流量限制与服务降级

在队列超过一定数量,请求量超过服务器处理能力的情况下,给用户返回 失败/预设内容/缓存信息/引导到上级页面,从而保证业务的正常运行

6.应用自身缓存,分布式缓存

对于频繁操作的数据,或者计算量大的数据,可用将数据存放到缓存中
有些场景可以牺牲数据一致性,数据优先读写缓存,然后再由定期计划任务去更新到数据库,新浪微博的点赞就是这种解决方案

7.数据库分表分库,读写分离

根据业务或者数据量,将数据库拆分成多个表和多个库,按照 数据量/数据id/用户id 来将数据存储到具体的库与表中
读取的时候从多个表和数据库里面获取数据,然后合并到一起返回

数据库按照读写分离为主库和从库,主库主要负责数据更新写入,从库负责同步数据和读取数据,对读多写少的场景效果比较好
从库同步是需要时间的,并不能写入后马上读取从库,解决方法目前我也想了一些,不过并不成熟

7. 如何保持数据一致性的问题

本项目不能保持强一致性,只能依靠事务型消息实现最终一致性。

强一致性可以使用分布式锁,但是牺牲了并发性。

8. mybatis注解实现原理

找不到啊,只找到了mybatis运行原理

Mybatis运行原理

Resources类, Mybatis中IO流工具类。作用:加载mybatis.xml配置文件。
SqlSessonFactoryBuilder() 构建器。作用:创建SqlSessionFactory接口的实现类。
XMLconfigBuilder类, Mybatis全局配置文件内容构建器类。作用:负责读取流内容并转换为JAVA代码。
Configuration类, 封装了全局配置文件所有配置信息。
DefaultSqlSessionFactory类,是SqlSessionFactory接口的实现类。
Transaction事务类。每个SqlSession会带有一个Transaction对象。
TransactionFactory事务工厂。负责生产Transaction。
Executor类,Mybatis执行器。作用:负责执行SQL命令,相当于JDBC中statement对象(或者PrepareStatement或CallableStatement),默认执行器为SimpleExcutor、批量操作为BatchExcutor,通过openSession(参数控制)
DefaultSqlSession类是SqlSession接口的实现类
10.ExceptionFactory类,Mybatis中异常工厂。
运行流程:

在这里插入图片描述

文字描述:
首先,在Mybatis运行开始时需要先通过Resources加载全局配置文件,下面需要实例化SqlSessionFactoryBuilder构建器,帮助SqlSessionFactory接口实现DefaultSqlSessionFactory。
其次,在实例化DefaultSqlSessionFactory之前,需要先创建XmlConfigBuilder解析全局配置文件流,并把解析结果存放在Configuration之中,之后把Configuration传递给DefaultSqlSessionFactory。到此SqlSessionFactory工厂创建成功。
然后,由SqlSessionFactory工厂创建SqlSession,每次创建SqlSession时,都需要TransactionFactory创建Transactio对象,同时还需要创建SqlSession的执行器Excutor,最后实例化DefaultSqlSession,传递给SqlSession接口。
最后, 根据项目需求使用SqlSession接口中的API完成具体的事务操作。
如果事务执行成功,提交给数据库,关闭SqlSession。
如果事务执行失败,需要进行rollback回滚事务。

9. Linux熟吗(不熟)

10. 算法题:8G内存,在100亿个32位整数中找到中位数(大数据的中位数,桶排序)

https://blog.csdn.net/weixin_36795183/article/details/103683323

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值