当前位置: 首页 > news >正文

php网站建设与管理温州住房建设网站

php网站建设与管理,温州住房建设网站,无聊的网站,宁波其它区低价企业网站搭建哪家好什么是自旋锁和互斥锁#xff1f; 由于CLH锁是一种自旋锁#xff0c;那么我们先来看看自旋锁是什么#xff1f; 自旋锁说白了也是一种互斥锁#xff0c;只不过没有抢到锁的线程会一直自旋等待锁的释放#xff0c;处于busy-waiting的状态#xff0c;此时等待锁的线程不会…什么是自旋锁和互斥锁 由于CLH锁是一种自旋锁那么我们先来看看自旋锁是什么 自旋锁说白了也是一种互斥锁只不过没有抢到锁的线程会一直自旋等待锁的释放处于busy-waiting的状态此时等待锁的线程不会进入休眠状态而是一直忙等待浪费CPU周期。因此自旋锁适用于锁占用时间短的场合。 这里谈到了自旋锁那么我们也顺便说下互斥锁。这里的互斥锁说的是传统意义的互斥锁就是多个线程并发竞争锁的时候没有抢到锁的线程会进入休眠状态即sleep-waiting当锁被释放的时候处于休眠状态的一个线程会再次获取到锁。缺点就是这一些列过程需要线程切换需要执行很多CPU指令同样需要时间。如果CPU执行线程切换的时间比锁占用的时间还长那么可能还不如使用自旋锁。因此互斥锁适用于锁占用时间长的场合。 1、为什么要使用消息队列? 分析:一个用消息队列的人不知道为啥用有点尴尬。没有复习这点很容易被问蒙然后就开始胡扯了。 回答:这个问题,咱只答三个最主要的应用场景(不可否认还有其他的但是只答三个主要的),即以下六个字:解耦、异步、削峰 (1)解耦 传统模式: 传统模式的缺点 系统间耦合性太强如上图所示系统A在代码中直接调用系统B和系统C的代码如果将来D系统接入系统A还需要修改代码过于麻烦 中间件模式: 中间件模式的的优点 将消息写入消息队列需要消息的系统自己从消息队列中订阅从而系统A不需要做任何修改。 (2)异步 传统模式: 传统模式的缺点 一些非必要的业务逻辑以同步的方式运行太耗费时间。 中间件模式: 中间件模式的的优点 将消息写入消息队列非必要的业务逻辑以异步的方式运行加快响应速度 (3)削峰 传统模式 传统模式的缺点 并发量大的时候所有的请求直接怼到数据库造成数据库连接异常 中间件模式: 中间件模式的的优点 系统A慢慢的按照数据库能处理的并发量从消息队列中慢慢拉取消息。在生产中这个短暂的高峰期积压是允许的。 2、使用了消息队列会有什么缺点? 分析:一个使用了MQ的项目如果连这个问题都没有考虑过就把MQ引进去了那就给自己的项目带来了风险。 我们引入一个技术要对这个技术的弊端有充分的认识才能做好预防。要记住不要给公司挖坑 回答:回答也很容易从以下两个个角度来答 系统可用性降低: 你想啊本来其他系统只要运行好好的那你的系统就是正常的。 现在你非要加个消息队列进去那消息队列挂了你的系统不是呵呵了。因此系统可用性降低 系统复杂性增加: 要多考虑很多方面的问题比如一致性问题、如何保证消息不被重复消费如何保证保证消息可靠传输。 因此需要考虑的东西更多系统复杂性增大。 但是我们该用还是要用的。 3、消息队列如何选型? 先说一下博主只会ActiveMQ,RabbitMQ,RocketMQ,Kafka对什么ZeroMQ等其他MQ没啥理解因此只能基于这四种MQ给出回答。 分析:既然在项目中用了MQ肯定事先要对业界流行的MQ进行调研如果连每种MQ的优缺点都没了解清楚就拍脑袋依据喜好用了某种MQ还是给项目挖坑。 如果面试官问:你为什么用这种MQ。你直接回答领导决定的。这种回答就很LOW了。 还是那句话不要给公司挖坑。 我们可以看出RabbitMQ版本发布比ActiveMq频繁很多。至于RocketMQ和kafka就不带大家看了总之也比ActiveMQ活跃的多。详情可自行查阅。 再来一个性能对比表 综合上面的材料得出以下两点: (1)中小型软件公司建议选RabbitMQ. 一方面erlang语言天生具备高并发的特性而且他的管理界面用起来十分方便。 正所谓成也萧何败也萧何他的弊端也在这里虽然RabbitMQ是开源的然而国内有几个能定制化开发erlang的程序员呢 所幸RabbitMQ的社区十分活跃可以解决开发过程中遇到的bug这点对于中小型公司来说十分重要。 不考虑rocketmq和kafka的原因是一方面中小型软件公司不如互联网公司数据量没那么大选消息中间件应首选功能比较完备的所以kafka排除。 不考虑rocketmq的原因是rocketmq是阿里出品如果阿里放弃维护rocketmq中小型公司一般抽不出人来进行rocketmq的定制化开发因此不推荐。 (2)大型软件公司根据具体使用在rocketMq和kafka之间二选一 一方面大型软件公司具备足够的资金搭建分布式环境也具备足够大的数据量。 针对rocketMQ,大型软件公司也可以抽出人手对rocketMQ进行定制化开发毕竟国内有能力改JAVA源码的人还是相当多的。 至于kafka根据业务场景选择如果有日志采集功能肯定是首选kafka了。具体该选哪个看使用场景。 4、如何保证消息队列是高可用的 分析:在第二点说过了引入消息队列后系统的可用性下降。在生产中没人使用单机模式的消息队列。 因此作为一个合格的程序员应该对消息队列的高可用有很深刻的了解。 如果面试的时候面试官问你们的消息中间件如何保证高可用的 如果你的回答只是表明自己只会订阅和发布消息面试官就会怀疑你是不是只是自己搭着玩压根没在生产用过。 因此请做一个爱思考会思考懂思考的程序员。 回答:这问题其实要对消息队列的集群模式要有深刻了解才好回答。 以rcoketMQ为例他的集群就有多master 模式、多master多slave异步复制模式、多 master多slave同步双写模式。 多master多slave模式部署架构图(网上找的,偷个懒懒得画): 其实博主第一眼看到这个图就觉得和kafka好像只是NameServer集群在kafka中是用zookeeper代替都是用来保存和发现master和slave用的。 通信过程如下: Producer 与 NameServer集群中的其中一个节点随机选择建立长连接定期从 NameServer 获取 Topic 路由信息并向提供 Topic 服务的 Broker Master 建立长连接且定时向 Broker 发送心跳。 Producer 只能将消息发送到 Broker master但是 Consumer 则不一样它同时和提供 Topic 服务的 Master 和 Slave建立长连接既可以从 Broker Master 订阅消息也可以从 Broker Slave 订阅消息。 那么kafka呢,为了对比说明直接上kafka的拓补架构图(也是找的懒得画) 如上图所示一个典型的Kafka集群中包含若干Producer可以是web前端产生的Page View或者是服务器日志系统CPU、Memory等若干brokerKafka支持水平扩展一般broker数量越多集群吞吐率越高若干Consumer Group以及一个Zookeeper集群。 Kafka通过Zookeeper管理集群配置选举leader以及在Consumer Group发生变化时进行rebalance。 Producer使用push模式将消息发布到brokerConsumer使用pull模式从broker订阅并消费消息。 至于rabbitMQ,也有普通集群和镜像集群模式自行去了解比较简单两小时即懂。 要求在回答高可用的问题时应该能逻辑清晰的画出自己的MQ集群架构或清晰的叙述出来。 5、如何保证消息不被重复消费 分析:这个问题其实换一种问法就是如何保证消息队列的幂等性? 这个问题可以认为是消息队列领域的基本问题。换句话来说是在考察你的设计能力这个问题的回答可以根据具体的业务场景来答没有固定的答案。 回答:先来说一下为什么会造成重复消费? 其实无论是那种消息队列造成重复消费原因其实都是类似的。 正常情况下消费者在消费消息时候消费完毕后会发送一个确认信息给消息队列消息队列就知道该消息被消费了就会将该消息从消息队列中删除。只是不同的消息队列发送的确认信息形式不同 例如RabbitMQ是发送一个ACK确认消息RocketMQ是返回一个CONSUME_SUCCESS成功标志kafka实际上有个offset的概念 简单说一下(如果还不懂出门找一个kafka入门到精通教程),就是每一个消息都有一个offsetkafka消费过消息后需要提交offset让消息队列知道自己已经消费过了。 那造成重复消费的原因? 就是因为网络传输等等故障确认信息没有传送到消息队列导致消息队列不知道自己已经消费过该消息了再次将该消息分发给其他的消费者。 如何解决?这个问题针对业务场景来答分以下几点 (1)比如你拿到这个消息做数据库的insert操作。 那就容易了给这个消息做一个唯一主键那么就算出现重复消费的情况就会导致主键冲突避免数据库出现脏数据。 (2)再比如你拿到这个消息做redis的set的操作 那就容易了不用解决。因为你无论set几次结果都是一样的set操作本来就算幂等操作。 (3)如果上面两种情况还不行上大招。 准备一个第三方介质,来做消费记录。以redis为例给消息分配一个全局id只要消费过该消息将以K-V形式写入redis。那消费者开始消费前先去redis中查询有没消费记录即可。 6、如何保证消费的可靠性传输? 分析:我们在使用消息队列的过程中应该做到消息不能多消费也不能少消费。如果无法做到可靠性传输可能给公司带来千万级别的财产损失。 同样的如果可靠性传输在使用过程中没有考虑到这不是给公司挖坑么你可以拍拍屁股走了公司损失的钱谁承担。 还是那句话认真对待每一个项目不要给公司挖坑 回答:其实这个可靠性传输每种MQ都要从三个角度来分析:生产者弄丢数据、消息队列弄丢数据、消费者弄丢数据 RabbitMQ (1)生产者丢数据 从生产者弄丢数据这个角度来看RabbitMQ提供transaction和confirm模式来确保生产者不丢消息。 transaction机制就是说发送消息前开启事物(channel.txSelect())然后发送消息如果发送过程中出现什么异常事物就会回滚(channel.txRollback())如果发送成功则提交事物(channel.txCommit())。 然而缺点就是吞吐量下降了。因此按照博主的经验生产上用confirm模式的居多。 一旦channel进入confirm模式所有在该信道上面发布的消息都将会被指派一个唯一的ID(从1开始) 一旦消息被投递到所有匹配的队列之后rabbitMQ就会发送一个Ack给生产者(包含消息的唯一ID) 这就使得生产者知道消息已经正确到达目的队列了.如果rabiitMQ没能处理该消息则会发送一个Nack消息给你你可以进行重试操作。 处理Ack和Nack的代码如下所示说好不上代码的偷偷上了: channel.addConfirmListener(new ConfirmListener() {Overridepublic void handleNack(long deliveryTag, boolean multiple) throws IOException {System.out.println(nack: deliveryTag deliveryTag multiple: multiple);}Overridepublic void handleAck(long deliveryTag, boolean multiple) throws IOException {System.out.println(ack: deliveryTag deliveryTag multiple: multiple);} });(2)消息队列丢数据 处理消息队列丢数据的情况一般是开启持久化磁盘的配置。 这个持久化配置可以和confirm机制配合使用你可以在消息持久化磁盘后再给生产者发送一个Ack信号。 这样如果消息持久化磁盘之前rabbitMQ阵亡了那么生产者收不到Ack信号生产者会自动重发。 那么如何持久化呢这里顺便说一下吧其实也很容易就下面两步 1、将queue的持久化标识durable设置为true,则代表是一个持久的队列 2、发送消息的时候将deliveryMode2 这样设置以后rabbitMQ就算挂了重启后也能恢复数据 (3)消费者丢数据 消费者丢数据一般是因为采用了自动确认消息模式。 这种模式下消费者会自动确认收到信息。这时rahbitMQ会立即将消息删除这种情况下如果消费者出现异常而没能处理该消息就会丢失该消息。 至于解决方案采用手动确认消息即可。 kafka Producer在发布消息到某个Partition时先通过ZooKeeper找到该Partition的Leader 然后无论该Topic的Replication Factor为多少也即该Partition有多少个ReplicaProducer只将该消息发送到该Partition的Leader。 Leader会将该消息写入其本地Log。每个Follower都从Leader中pull数据。 针对上述情况得出如下分析 (1)生产者丢数据 在kafka生产中基本都有一个leader和多个follwer。follwer会去同步leader的信息。 因此为了避免生产者丢数据做如下两点配置 第一个配置要在producer端设置acksall。这个配置保证了follwer同步完成后才认为消息发送成功。 在producer端设置retriesMAX一旦写入失败这无限重试 (2)消息队列丢数据 针对消息队列丢数据的情况无外乎就是数据还没同步leader就挂了这时zookpeer会将其他的follwer切换为leader,那数据就丢失了。 针对这种情况应该做两个配置。 replication.factor参数这个值必须大于1即要求每个partition必须有至少2个副本 min.insync.replicas参数这个值必须大于1这个是要求一个leader至少感知到有至少一个follower还跟自己保持联系 这两个配置加上上面生产者的配置联合起来用基本可确保kafka不丢数据 (3)消费者丢数据 这种情况一般是自动提交了offset然后你处理程序过程中挂了。kafka以为你处理好了。 再强调一次offset是干嘛的 offset指的是kafka的topic中的每个消费组消费的下标。 简单的来说就是一条消息对应一个offset下标每次消费数据的时候如果提交offset那么下次消费就会从提交的offset加一那里开始消费。 比如一个topic中有100条数据我消费了50条并且提交了那么此时的kafka服务端记录提交的offset就是49(offset从0开始)那么下次消费的时候offset就从50开始消费。 解决方案也很简单改成手动提交即可。 ActiveMQ和RocketMQ 大家自行查阅吧 7、如何保证消息的顺序性 分析:其实并非所有的公司都有这种业务需求但是还是对这个问题要有所复习。 回答:针对这个问题通过某种算法将需要保持先后顺序的消息放到同一个消息队列中(kafka中就是partition,rabbitMq中就是queue)。然后只用一个消费者去消费该队列。 有的人会问:那如果为了吞吐量有多个消费者去消费怎么办 这个问题没有固定回答的套路。比如我们有一个微博的操作发微博、写评论、删除微博这三个异步操作。如果是这样一个业务场景那只要重试就行。 比如你一个消费者先执行了写评论的操作但是这时候微博都还没发写评论一定是失败的等一段时间。等另一个消费者先执行写评论的操作后再执行就可以成功。 总之针对这个问题我的观点是保证入队有序就行出队以后的顺序交给消费者自己去保证没有固定套路。 最后 小编利用空余时间整理了一份《MySQL性能调优手册》初衷也很简单就是希望能够帮助到大家减轻大家的负担和节省时间。 关于这个给大家看一份学习大纲PDF文件每一个分支里面会有详细的介绍。 这里都是以图片形式展示介绍如要下载原文件以及更多的性能调优笔记MySQLTomcatJVM可以直接【点击 “性能调优”】免费下载 就可以成功。 总之针对这个问题我的观点是保证入队有序就行出队以后的顺序交给消费者自己去保证没有固定套路。 最后 小编利用空余时间整理了一份《MySQL性能调优手册》初衷也很简单就是希望能够帮助到大家减轻大家的负担和节省时间。 关于这个给大家看一份学习大纲PDF文件每一个分支里面会有详细的介绍。 [外链图片转存中…(img-4JyE6rxr-1623850686005)] 这里都是以图片形式展示介绍如要下载原文件以及更多的性能调优笔记MySQLTomcatJVM可以直接【点击 “性能调优”】免费下载
http://www.zqtcl.cn/news/195474/

相关文章:

  • 360网站制作潍坊医疗网站建设方案
  • 深圳网站策划公司域名解析暂时失败
  • 怎么做安居客网站wordpress 函数文件
  • 微名片网站怎么做html代码表示
  • 两学一做纪实评价系统网站如何做好百度推广
  • 网站设置手机才能播放企业网站开发需求
  • 网站建设微信运营销售做网站用啥语言
  • dw建设网站步骤活动汪活动策划网站
  • 民和县公司网站建设网站开发的特点
  • 模板企业快速建站上传网站中ftp地址写什么
  • 云南本地企业做网站太原网站制作公司哪家好
  • 西部数码域名网站模板wordpress抓取股票行情
  • 丰台深圳网站建设公司关于服装店网站建设的策划方案
  • win7 iis网站无法显示随州网站建设哪家实惠
  • 利用网站新媒体宣传法治建设建站哪个平台好
  • 网站seo课设wordpress 500 根目录
  • 电子商务网站建设的阶段化分析如何利用视频网站做数字营销推广
  • 电子商务网站建设ppt模板国外注册机网站
  • 西部数码做跳转网站百度seo排名培训优化
  • 农业网站素材wordpress all in one
  • 学习网站建设有前景没wordpress 和dokuwiki
  • 服装网站开发方案网站设计美工排版编辑
  • 旅游网站首页模板下载广州市建设工程检测中心网站
  • 餐饮加盟网站建设wordpress 首行缩进
  • kkday是哪里做的网站橙云 php网站建设
  • 站长之家0网站规划作品
  • 物流公司网站建设系统规划广告设计怎么学
  • 异地备案 网站中信建设有限责任公司经济性质
  • 网站没有备案怎么申请广告宿迁莱布拉网站建设
  • 太原适合网站设计地址网站建设 教学视频教程