当前位置: 首页 > 后端技术 > PHP

关于高并发的15道PHP面试题(总结)

时间:2023-03-30 02:49:46 PHP

1.什么是rabbitmq一种使用AMQP高级消息队列协议的消息队列技术。最大的特点是消费不需要保证provider的存在,实现了service之间的高度解耦2.为什么要用rabbitmq1)在其下具有异步、调峰、负载均衡等一系列高级功能分布式系统;2)具有持久化机制,处理消息,队列中的信息也可以保存。3)实现消费者和生产者之间的解耦。4)对于并发场景,使用消息队列可以让同步访问变成串行访问,达到一定的限流,有利于数据库的运行。可以使用消息队列来实现异步下单的效果。排队的时候,后台会下逻辑订单3、使用rabbitmq的场景1)服务间异步通信2)顺序消费3)定时任务4)请求调峰4、如何保证消息正确发送到RabbitMQ?如何保证消息的接收者消费消息?Senderconfirmationmode将频道设置为确认模式(senderconfirmationmode),频道上发布的所有消息都会被分配一个唯一的ID。一旦消息被传递到目标队列,或者消息被写入磁盘(持久消息),通道将向生产者发送确认(包括消息的唯一ID)。如果RabbitMQ发生内部错误导致消息丢失,将发送nack(未确认)消息。发送方确认模式是异步的,生产者应用程序可以在等待确认期间继续发送消息。当确认消息到达生产者应用程序时,生产者应用程序的回调方法被触发以处理确认消息。ReceiverconfirmationmechanismReceiver消息确认机制消费者在收到每条消息后都要进行确认(消息接收和消息确认是两个不同的操作)。只有消费者确认了消息,RabbitMQ才能安全地从队列中删除消息。这里没有使用超时机制,RabbitMQ只是通过Consumer连接的中断来确认是否需要重新发送消息。也就是说,只要连接不中断,RabbitMQ就给了Consumer足够长的时间来处理消息。保证数据的最终一致性;以下是一些特殊情况。如果消费者收到消息,在确认之前断开连接或取消订阅,RabbitMQ会认为消息没有分发,然后重新分发给下一个订阅的消费者。(可能存在重复消费消息的隐患,需要去重)如果消费者收到消息但没有确认消息,并且没有断开连接,RabbitMQ认为消费者很忙,不会再分发消息给消费者。5、如何避免消息重复投递或重复消费?在消息生产过程中,MQ内部会为生产者发送的每条消息生成一个inner-msg-id,作为去重(消息投递失败重传)的依据,避免重复的消息进入队列;消息消费时,要求消息正文中必须有一个bizId(对同一业务全局唯一,如支付ID、订单ID、帖子ID等)作为去重的依据,避免重复消费同一条消息。6.消息是基于什么传输的?由于TCP连接的创建和销毁代价高昂,并且并发数受系统资源限制,会造成性能瓶颈。RabbitMQ使用通道来传输数据。通道是在真实TCP连接内建立的虚拟连接,每个TCP连接上的通道数没有限制。7、如何发布消息?如果队列中至少有一个消费者订阅,则消息会以循环的方式发送给消费者。每条消息只会分发给一个订阅的消费者(前提是消费者能正常处理消息并确认)。通过路由可以实现多消费的功能8.如何路由消息?Messageprovider->routing->oneormorequeues当一条消息被发布到一个exchange时,该消息会有一个路由键(routingkey),它是在创建消息时设置的。通过queueroutingkey,可以将queue绑定到exchange。消息到达交换机后,RabbitMQ会将消息的routingkey与队列的routingkey进行匹配(不同的交换机有不同的路由规则);常用的交换机主要分为以下三种fanout:如果交换机收到消息,就会广播给所有绑定的队列。direct:如果routingkey完全匹配,则消息会被投递到对应的队列中。topic:来自不同来源的消息可以到达同一个队列。使用主题交换时,可以使用通配符。9、如何保证消息不丢失?消息持久化,当然,前提是队列必须是持久化的RabbitMQ通过将持久化消息写入磁盘上的持久化日志文件来确保持久化消息在服务器重启后可以恢复。,在消息提交到日志文件之前,Rabbit不会发送响应。一旦消费者从持久化队列中消费了一条持久化消息,RabbitMQ就会在持久化日志中将该消息标记为等待垃圾回收。如果在使用持久消息之前重启RabbitMQ,Rabbit将自动重建交换和队列(和绑定),并将消息从持久日志文件重新发布到适当的队列。10.使用RabbitMQ有什么好处?1)服务间高度解耦2)异步通信性能高3)流量调峰11、rabbitmq集群镜像集群模式你创建的队列,无论元数据还是队列中的消息,都会存在于多个实例上,然后每次当你向队列写入消息时,消息会自动发送到多个实例的队列中进行消息同步。好处是如果你的任何一台机器挂了也没关系,其他的机器还能用。缺点是,第一,性能开销太高。消息跨所有机器同步,压力大,网络带宽消耗大!第二,这么玩的话,完全没有可扩展性。如果一个队列负载很重,你添加一台机器,新添加的机器也包含这个队列的所有数据。没有办法线性扩展你的queue12,mq缺点系统可用性下降系统引入的外部依赖越多,越容易挂掉。本来你是系统A调用BCD、BCD这三个系统的接口。ABCD四个系统都可以,没问题,你加一个MQ进来就可以了,万一MQ挂了怎么办?MQ挂了,整个系统崩溃,你这不就完了吗?系统复杂度增加,突然加入MQ。如何保证消息不被重复消费?消息丢失的情况如何处理?如何保证消息传递的顺序?头大头大,毛病多多,痛不欲生。13.一致性问题系统A处理完后,直接返回success。人们认为你的请求成功了;但是问题来了,如果BCD是三个系统,BD是两个系统库写成功了,但是C系统写库失败,怎么办?你的数据不一致。所以消息队列其实是一个非常复杂的架构。你可以介绍它有很多好处,但是你必须做各种额外的技术解决方案和架构来避免它带来的缺点。最好之后,你会发现,妈耶,系统的复杂度增加了一个数量级,可能复杂10倍。但是关键时刻,用,还是不得不用14.分布式事务是分段提交的。会有一个仲裁员,然后向所有节点发送消息。只有所有节点ack之后,才会成功。否则,您必须等待重传。15、直播突发大流量情况如何设计。1)NGINX加机2)CDN缓存静态页面3)Redis队列,让用户慢慢进来。4)添加缓存。缓存用户数据,例如用户信息。5)数据库采用master-slave6)弹性扩展7)注意限流熔断点,大家不要迷路,以上就是本文的全部内容,能看到这里的都是人才。前面说了PHP的技术点很多,也是因为太多了,写的太多了,写完了也不会看太多,所以我这里整理成了PDF和文档,有需要的可以点击进入秘籍:PHP+「平台」更多学习内容可以访问【比大厂】优质PHP架构师教程目录,只要会看,薪资高会更上一层楼(持续更新)。以上内容希望对大家有所帮助,很多PHPer在进阶的时候总会遇到一些问题和瓶颈。业务代码写多了就没有方向感。架构、高扩展、高性能、高并发、服务器性能调优、TP6、laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等进阶知识点级别的干货,可以免费分享给大家,需要的话可以加入我的PHP技术交流群