一、swoole、hypef、swoft
1、TCP、UDP、Unix Socket、HTTP、 WebSoct
TCP:面向连接可靠的传输协议,会先建立连接,有确认应答、重传机制主要目的是保证数据的顺序性和完整性,常用于文件传输 FTP、电子邮件、网络浏览等大部分应用。
UDP:是一种无连接的传输层协议,发送数据时不需要建立连接,每个数据包都是独立的,适用于对实时性要求高,允许一定数据丢失的场景,如在线视频、音频流(如直播)、在线游戏、DNS 查询等。
Unix Socket:常用于同一主机上不同进程之间的通信,如数据库服务器和应用服务器之间的通信,系统服务之间的通信等。
HTTP :是一种应用层协议,主要用于 Web 服务器和客户端之间的通信。
WebSocket :是一种全双工通信协议,建立在 TCP 之上,为 Web 应用程序提供了持久连接,允许服务器主动向客户端推送数据。
AMQP:是提供统一消息服务的应用层标准协议,基于此协议的客户端与消息中间可传递消息,作为中间层服务,把消费和生产分割开来,可以做到相互联系和互不影响。
建立连接的三次握手和四次挥手这个网上有很多帖子详细介绍。
2、一个完整的 http 请求包含什么
包含请求和响应,请求包含请求行和请求头。
请求行有请求方式如get、post、put、delete,还有请求资源路径和协议版本。
请求头包含:host 请求目标的服务器、user-agent 用户的软件信息浏览器型号等
响应包含协议版本、状态码、content-type 返回的数据格式、数据长度,还有响应的内容如 html/json 等。
3、swoole 的 master 进程、worker进程、taskWorker 进程
swoole 的进程线程还有协程官方文档都有很详细的解释,我这里只根据自己的理解做一下简述,master 进程是 swoole 的主进程和管理进程负责整个服务的生命周期,worker 进程是负责处理具体业务逻辑和 http 请求,它们之间相互独立,互不影响,如果某个 worker 进程崩溃,master 会自动重启崩溃的 worker 进程。而 taskWorker 进程是专门处理一些耗时的异步任务。
4、swoole 协程
swoole 的异步协程编程也是非常重要的部分,协程编程和常见的同步阻塞编程不同,它是 work 进程下创建的不需要操作系统参与,协程之间的通信是通过Channel(可以理解为协程间的消息队列),所有的协程必须创建在协程容器Coroutine里面。还有一个特点就是协程编程不能使用全局变量,为什么结合协程特性好好想想。还有就是全局变量不能用在协程容器内,因为协程的切换是不确定性的会造成数据错乱。
二、业务开发相关问题
1、api 接口如何保证数据的安全性和唯一性
使用sign签名,每次请求接口必须携带签名进行验证。
前端工程师 把 app版本号、app类型、手机设备号、手机型号、时间戳等参数放入header ,并把参数做aes加密处理生成sign字符串,每次http请求都携带sign
后端拿到header的参数和sign对参数进行校验,判断sign时间是否过期。
sign 唯一性,sign存入缓存,设置过期时间,保证sign 的唯一性。
2、商品抢购
1 独立服务,不能和主业务同一个服务
2 负载均衡
3 抢购页面必须是纯静态话页面,有动态数据例如库存,可以抛送ajax请求 php api,或者nginx + lua + redis
4 库存多台服务器问题解决思路,1 均衡本地服务器的库存,用户抢到后把用户id和数量传递到kafka,然后再去kafka拿信息,创建订单,最后数据入库mysql
5 如何杜绝黑产,薅羊毛,机器抢购,可以在抢购逻辑增加ip和用户限制,还可以根据日志落盘,去时时分析,离线分析,来源分析,如果来源不是通过活动入口进来的就是非法用户。
6 系统评估
3、说一下你对框架的理解
框架的本质和存在的意义:能够帮助程序员使用更少的代码量更快速的实现业务功能,可以理解为一个专业的工具。
框架的核心:类的自动加载、ioc容器、路由、配置文件的加载、设计模式、控制器、model
类的自动加载
为了解决大量使用incude require php文件,使用到的核心php函数sql_autoload_register,去实现php类库文件的自动加载。
ioc容器
核心是php设计模式,可以理解为把加载的类库全部都存放在这个容器里统一管理,例如tp的facade类就是使用了门面模式,为容器中的类提供了一个静态调用的接口,相比传统的静态方法带来了更多的可测试性和扩展性。
4、消息队列
可一利用redis 的有序集合做延时队列
入列:key 时间戳+过期时间 orderId
出列:开启一个work进程,while 循环 sleep 1秒,利用redis 有序集合的范围查询 key 0 当前时间戳 limit 0 1 拿到订单id,去mysql 查询订单状态,如果是待支付,更改状态为取消,如果是已支付,更改订单状态,减库存等操作。
5、业务服务的演变过程
在一个项目从立项到开发到上线,大部分初始都是使用单体架构,然而随着公司的发展和业务的扩展还有技术团队的增加,多业务相互关联又相互影响,上线复杂,例如今天 a 组开发了功能上线,有可能会造成其它业务模块的功能性 bug。然后就是垂直拆分,在业务代码层进行独立拆分,各业务之间的数据访问使用 api 的方式,然而还是有问题,例如数据库,还是相互影响。最终就是微服务现在中大型互联网公司使用的服务架构,一般包括 业务集群、cdn、网管、nginx 负载均衡、服务注册中心、配置中心、mysql 集群、redis 集群、Rabbit MQ、Elasticsearch 集群、阿里云 oss、大数据(hadoop、kafuka)
三、mysql的性能与查询优化
1、msyql基础知识
存储引擎
InnoDB 是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键
MyISAM 拥有较高的插入、查询速度,但不支持事务
回表、覆盖索引、索引优化原则
回表:当执行一条 sql 语句 ,会优先使用索引定位到记录的 id 主键,而sql 语句的字段又有其它列的数据,这些数据不在索引中,数据库会根据主键再找到完整记录,这个过程就叫做回表。在数据量非常大或者查询结果非常多的情况下会产生大量的 io 开销,回表的性能问题就会突出明显。
覆盖索引:覆盖索引是指查询语句只需要从索引中获取所需数据,不需要回表。所以它的查询性能非常高。但是在实际工作中,能够全覆盖索引情况是很少的。
索引优化原则:索引优化原则是和业务的查询条件分不开的,需要结合系统常用到的条件、排序字段进行索引的建立,总得来说对于多条件查询建立复合索引查询应该遵循最左原则才可以有效的利用复合索引,对于模糊查询 like %name% 建立独立的全文索引,还有索引的建立需要考虑其基数,像状态这样的字段,无需建立独立的索引需要结合其它字段建立复合索引。
如何查询 sql 语句的索引命中信息
EXPLAIN 关键字的使用可以查询 sql 语句的索引命中情况
mysql的索引类型和方法
mysql 的索引类型有唯一索引、普通索引、空间索引、全文索引,方法有 btree 和 hash
b+tree
总得来说是 b+树比 b 树有更高的性能,b+的数据只存在叶子节点,b 树是所有节点都存储数据,b+在查询数据时候使用的磁盘 io 次数更少,还有b 树不支持高效的范围查找还有insert 数据 b 树对节点的操作更多。
事务和 MVCC和两阶段提交
事务是什么就不过多介绍,原子性、隔离性、持久性、一致性。
主要说下事务的隔离级别,可重复度(默认级

文章讨论了如何通过签名验证确保app接口的数据安全性和唯一性,利用Redis实现延时队列和数据持久化,以及应对缓存穿透和雪崩的问题。还介绍了MySQL的优化策略和不同存储引擎的特点。此外,提到了框架的作用、类的自动加载和IOC容器的概念,并探讨了消息队列在抢购场景下的应用和防止黑产的措施,包括RPC、ELK、RabbitMQ和Swoole等相关技术。
最低0.47元/天 解锁文章
813

被折叠的 条评论
为什么被折叠?



