rabbitmq 拉取消息太慢_面试官:消息队列这些我都要问

作者:mousycoder

segmentfault.com/a/1190000021054802

消息队列连环炮

  1. 项目里怎么样使用 MQ 的?

  2. 为什么要使用消息队列?

  3. 消息队列有什么优点和缺点?

  4. kafka,activemq,rabbitmq,rocketmq 都有什么去呗?

  5. 如何保证消息队列高可用?

  6. 如何保证消息不被重复消费?

  7. 如何保证消息的可靠性传输?

  8. 如何保证消息的顺序性?

  9. 写一个消息队列架构设计?

消息队列技术选型

解决的问题:

  • 解耦

  • 异步

  • 削峰

不用 MQ 系统耦合场景

591e69f4b3f6ab0cfd43bc9a7edbe696.png

A 系统产生了一个比较关键的数据,很多系统需要 A 系统将数据发过来,强耦合(B,C,D,E 系统可能参数不一样、一会需要一会不需要数据,A 系统要不断修改代码维护)

A 系统还要考虑 B、C、D、E 系统是否挂了,是否访问超时?是否重试?

使用 MQ 系统解耦场景

d85775c2a3d3ac4826b6e4b44520404d.png

  1. 维护这个代码,不需要考虑人家是否调用成功,失败超时

  2. 如果新系统需要数据,直接从 MQ 里消费即可,如果某个系统不需要这条数据就取消对 MQ 消息的消费即可。

总结:通过一个 MQ 的发布订阅消息模型(Pub/Sub), 系统 A 跟其他系统就彻底解耦了。

不用 MQ 同步高延迟请求场景

ee8a80d7cfb934d0833f6e898cc01882.png

一般互联网类的企业,对用户的直接操作,一般要求每个请求都必须在 200ms以内,对用户几乎是无感知的。

使用 MQ 进行异步化之后的接口性能优化

3eb3ca1011cbbc701dc22c58a90be493.png

提高高延时接口

没有用 MQ 时高峰期系统被打死的场景

f3ffba3e026be68bb6ffbeb4883e9316.png

高峰期每秒 5000 个请求,每秒对 MySQL 执行 5000 条 SQL(一般MySQL每秒 2000 个请求差不多了),如果MySQL被打死,然后整个系统就崩溃,用户就没办法使用系统了。但是高峰期过了之后,每秒钟可能就 50 个请求,对整个系统没有任何压力。

使用 MQ 进行削峰的场景

9e316a5e896f1051cd63b069e0321cfd.png

5000 个请求写入到 MQ 里面,系统 A 每秒钟最多只能处理 2000 个请求(MySQL 每秒钟最多处理 2000 个请求),系统 A 从 MQ 里慢慢拉取请求,每秒钟拉取 2000 个请求。MQ,每秒钟 5000 个请求进来,结果只有 2000 个请求出去,结果导致在高峰期(21小时),可能有几十万甚至几百万的请求积压在 MQ 中,这个是正常的,因为过了高峰期之后,每秒钟就 50 个请求,但是系统 A 还是会按照每秒 2000 个该请求的速度去处理。只要高峰期一过,系统 A 就会快速的将积压的消息给解决掉。

算一笔账,每秒积压在 MQ 里消息有 3000 条,一分钟就会积压 18W 条消息,一个小时就会积压 1000 万条消息。等高峰期一过,差不多需要 1 个多小时就可以把 1000W 条积压的消息给处理掉

架构中引入 MQ 后存在的问题

40fddb2e2540fca985930ad6c9e7c9f2.png

  • 系统可用性降低

MQ 可能挂掉,导致整个系统崩溃

  • 系统复杂性变高

可能发重复消息,导致插入重复数据;消息丢了;消息顺序乱了;系统 B,C,D 挂了,导致 MQ 消息积累,磁盘满了;

  • 一致性问题

本来应该A,B,C,D 都执行成功了再返回,结果A,B,C 执行成功 D 失败

Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点

4c7b835f740ba17c0166166a8f5a41c8.png

建议:中小型公司 RabbitMQ 大公司:RocketMQ 大数据实时计算:Kafka

消息队列高可用

RabbtitMQ 高可用

RabbitMQ有三种模式:单机模式 、普通集群模式、镜像集群模式

  • 单机模式

demo级

  • 普通集群模式(非高可用)

队列的元数据存在于多个实例中,但是消息不存在多个实例中,每次多台机器上启动多个 rabbitmq 实例,每个机器启动一个。

94d88a299ed560eb65f986628e4957fa.png

  • 优点:可以多个机器消费消息,可以提高消费的吞吐量

  • 缺点:可能会在 rabbitmq 内部产生大量的数据传输 ;可用性基本没保障,queue 所在机器宕机,就没办法消费了

没有高可用性可言

  • 镜像集群模式(高可用,非分布式)

7c6a073cc4f34a1c9b7ca8d37d65a7cc.png

队列的元数据和消息都会存在于多个实例中,每次写消息到 queue的时候,都会自动把消息到多个实例的 queue 里进行消息同步。也就 是每个节点上都有这个 queue 的一个完整镜像(这个 queue的全部数据)。任何一个节点宕机了,其他节点还包含这个 queue的完整数据,其他 consumer 都可以到其他活着的节点上去消费数据都是 OK 的。

缺点:不是分布式的,如果这个 queue的数据量很大,大到这个机器上的容量无法容纳 。

开启镜像集群模式方法:管理控制台,Admin页面下,新增一个镜像集群模式的策略,指定的时候可以要求数据同步到所有节点,也可以要求同步到指定数量的节点,然后你再次创建 queue 的时候 ,应用这个策略,就 会自动将数据同步到其他的节点上去。

  • Kafka 高可用架构

97f1a1a80b1d209dfe21c107a1835d13.png

broker进程就是kafka在每台机器上启动的自己的一个进程。每台机器+机器上的broker进程,就可以认为是 kafka集群中的一个节点。

你创建一个 topic,这个topic可以划分为多个 partition,每个 partition 可以存在于不同的 broker 上,每个 partition就存放一部分数据。

这就是天然的分布式消息队列,也就是说一个 topic的数据,是分散放在 多个机器上的,每个机器就放一部分数据。

分布式的真正含义是每个节点只放一部分数据,而不是完整数据(完整数据就是HA、集群机制)
Kafka 0.8版本之前是没有 HA 机制的,任何一个 broker 宕机了,那么就缺失一部分数据。

Kafka 0.8以后,提供了 HA 机制,就是 replica 副本机制。

每个 partition的数据都会同步到其他机器上,形成自己的多个 replica 副本。然后所有 replica 会选举一个 leader。那么生产者、消费者都会和这个 leader 打交道,然后其他 replica 就是 follow。写的时候,leader 负责把数据同步到所有 follower上去,读的时候就直接读 leader 上的数据即可。

如果某个 broker宕机了,刚好也是 partition的leader,那么此时会选举一个新的 leader出来,大家继续读写那个新的 leader即可,这个就 是所谓的高可用性。

leader和follower的同步机制:

写数据的时候,生产者就写 leader,然后 leader将数据落地写本地磁盘,接着其他 follower 自己主动从 leader来pull数据。一旦所有 follower同步好数据了,就会发送 ack给 leader,leader收到所有 follower的 ack之后,就会返回写成功的消息给生产者。

消费的时候,只会从 leader去读,但是只有一个消息已经被所有 follower都同步成功返回 ack的时候,这个消息才会被消费者读到。

消息队列重复数据

MQ 只能保证消息不丢,不能保证重复发送

Kafka 消费端可能出现的重复消费问题

a409388e4bc3c2b44d42512f0f9f9f4c.png

每条消息都有一个 offset 代表 了这个消息的顺序的序号,按照数据进入 kafka的顺序,kafka会给每条数据分配一个 offset,代表了这个是数据的序号,消费者从 kafka去消费的时候,按照这个顺序去消费,消费者会去提交 offset,就是告诉 kafka已经消费到 offset=153这条数据了 ;zk里面就记录了消费者当前消费到了 offset =几的那条消息;假如此时消费者系统被重启,重启之后,消费者会找kafka,让kafka把上次我消费到的那个地方后面的数据继续给我传递过来。

重复消息原因:(主要发生在消费者重启后)

消费者不是说消费完一条数据就立马提交 offset的,而是定时定期提交一次 offset。消费者如果再准备提交 offset,但是还没提交 offset的时候,消费者进程重启了,那么此时已经消费过的消息的 offset并没有提交,kafka也就不知道你已经消费了 offset= 153那条数据,这个时候kafka会给你发offset=152,153,154的数据,此时 offset = 152,153的消息重复消费了

保证 MQ 重复消费幂等性

a7fbfafeac21bfba3e260f76863d9b29.png

幂等:一个数据或者一个请求,给你重复来多次,你得确保对应的数据是不会改变的,不能出错。
思路:

  • 拿数据要写库,首先检查下主键,如果有数据,则不插入,进行一次update

  • 如果是写 redis,就没问题,反正每次都是 set ,天然幂等性

  • 生产者发送消息的时候带上一个全局唯一的id,消费者拿到消息后,先根据这个id去 redis里查一下,之前有没消费过,没有消费过就处理,并且写入这个 id 到 redis,如果消费过了,则不处理。

  • 基于数据库的唯一键

保证 MQ 消息不丢

MQ 传递非常核心的消息,比如:广告计费系统,用户点击一次广告,扣费一块钱,如果扣费的时候消息丢了,则会不断少钱,积少成多,对公司是一个很大的损失。

RabbitMQ可能存在的数据丢失问题

aca4d6ca6b1449969f3498c587ae6631.png

  • 生产者写消息的过程中,消息都没有到 rabbitmq,在网络传输过程中就丢了。或者消息到了 rabbitmq,但是人家内部出错了没保存下来。

  • RabbitMQ 接收到消息之后先暂存在主机的内存里,结果消费者还没来得及消费,RabbitMQ自己挂掉了,就导致暂存在内存里的数据给搞丢了。

  • 消费者消费到了这个消费,但是还没来得及处理,自己就挂掉了,RabbitMQ 以为这个消费者已经处理完了。

问题 1解决方案:

事务机制:(一般不采用,同步的,生产者发送消息会同步阻塞卡住等待你是成功还是失败。会导致生产者发送消息的吞吐量降下来)

    channel.txSelect
try {
    //发送消息
} catch(Exception e){
    channel.txRollback;
    //再次重试发送这条消息

    channel.txCommit;

confirm机制:(一般采用这种机制,异步的模式,不会阻塞,吞吐量会比较高)

  • 先把 channel 设置成 confirm 模式

  • 发送一个消息到 rabbitmq

  • 发送完消息后就不用管了

  • rabbitmq 如果接收到了这条消息,就会回调你生产者本地的一个接口,通知你说这条消息我已经收到了

  • rabbitmq 如果在接收消息的时候报错了,就会回调你的接口,告诉你这个消息接收失败了,你可以再次重发。

public void ack(String messageId){

}

public void nack(String messageId){
    //再次重发一次这个消息
}

问题 2 解决方案:

持久化到磁盘

  • 创建queue的时候将其设置为持久化的,这样就可以保证 rabbitmq持久化queue的元数据,但是不会持久化queue里的数据

  • 发送消息的时候将 deliveryMode 设置为 2,将消息设置为持久化的,此时 rabbitmq就会将消息持久化到磁盘上去。必须同时设置 2 个持久化才行。

  • 持久化可以跟生产者那边的 confirm机制配合起来,只有消息被持久化到磁盘之后,才会通知生产者 ack了 ,所以哪怕是在持久化到磁盘之前 ,rabbitmq挂了,数据丢了,生产者收不到 ack,你也可以自己重发。

缺点:可能会有一点点丢失数据的可能,消息刚好写到了 rabbitmq中,但是还没来得及持久化到磁盘上,结果不巧, rabbitmq挂了,会导致内存里的一点点数据会丢失。

问题 3 解决方案:

原因:消费者打开了 autoAck机制(消费到一条消息,还在处理中,还没处理完,此时消费者自动 autoAck了,通知 rabbitmq说这条消息已经消费了,此时不巧,消费者系统宕机了,那条消息丢失了,还没处理完,而且 rabbitmq还以为这个消息已经处理掉了)

解决方案:关闭 autoAck,自己处理完了一条消息后,再发送 ack给 rabbitmq,如果此时还没处理完就宕机了,此时rabbitmq没收到你发的ack消息,然后 rabbitmq 就会将这条消息重新分配给其他的消费者去处理。

Kafka 可能存在的数据丢失问题

4b22ecf354ebd3e132f5937ee2ee6368.png

消费端弄丢数据

原因:消费者消费到那条消息后,自动提交了 offset,kafka以为你已经消费好了这条消息,结果消费者挂了,这条消息就丢了。

例子:消费者消费到数据后写到一个内存 queue里缓存下,消息自动提交 offset,重启了系统,结果会导致内存 queue 里还没来得及处理的数据丢失。

解决方法:kafka会自动提交 offset,那么只要关闭自动提交 offset,在处理完之后自己手动提交,可以保证数据不会丢。但是此时确实还是会重复消费,比如刚好处理完,还没提交 offset,结果自己挂了,此时肯定会重复消费一次 ,做好幂等即可。

Kafka 丢掉消息

原因:kafka 某个 broker 宕机,然后重新选举 partition 的 leader时,此时其他的 follower 刚好还有一些数据没有同步,结果此时 leader挂了,然后选举某个 follower成 leader之后,就丢掉了之前leader里未同步的数据。

例子:kafka的leader机器宕机,将 follower 切换为 leader之后,发现数据丢了
解决方案:(保证 kafka broker端在 leader发生故障,或者leader切换时,数据不会丢)

  • 给 topic设置 replication.factor ,这个值必须大于 1,保证每个 partition 必须至少有 2 个副本

  • 在 kafka 服务端设置 min.insync.replicas 参数,这个值必须大于 1,这个是要求一个leader至少感知到有至少一个follower还跟自己保持联系,没掉队,这样才能确保 leader挂了还有一个follower,保证至少一个 follower能和leader保持正常的数据同步。

  • 在 producer 端设置 acks =all,这个是要求每条数据,必须是写入所有 replica 之后,才能认为是写成功了。否则会生产者会一直重试,此时设置 retries = MAX(很大的重试的值),要求一旦写入失败,就卡在这里(避免消息丢失)

  • kafka 生产者丢消息

按 2 的方案设置了 ack =all,一定不会丢。它会要求 leader 接收到消息,所有的 follower 都同步 到了消息之后,才认为本次写成功。如果没满足这个条件,生产者会无限次重试 。

消息队列顺序性

背景:mysql binlog 同步的系统,在mysql里增删改一条数据,对应出来了增删改 3 条binlog,接着这 3 条binlog发送到 MQ 里面,到消费出来依次执行,起码是要保证顺序的吧,不然顺序变成了 删除、修改、增加。日同步数据达到上亿,mysql->mysql,比如大数据 team,需要同步一个mysql库,来对公司的业务系统的数据做各种复杂的操作。

场景:

  • rabbitmq,一个queue,多个consumer,这不明显乱了

  • kafka,一个topic,一个partition,一个consumer,内部多线程,这不也乱了

RabbitMQ 消息顺序错乱

8b4392265584746413861725ebee9615.png

RabbitMQ 如何保证消息顺序性

需要保证顺序的数据放到同一个queue里

832a1acf00e30add621b9662291213df.png

Kafka 消息顺序错乱

a6826445a1f4f596d9ad30c0bda87d22.png

写入一个 partition中的数据一定是有顺序的。

生产者在写的时候,可以指定一个 key,比如订单id作为key,那么订单相关的数据,一定会被分发到一个 partition中区,此时这个 partition中的数据一定是有顺序的。Kafka 中一个 partition 只能被一个消费者消费。消费者从partition中取出数据的时候 ,一定是有顺序的。

Kafka 保证消息顺序性

011296a1910144a4c651a62c60e92eab.png

如果消费者单线程消费+处理,如果处理比较耗时,处理一条消息是几十ms,一秒钟只能处理几十条数据,这个吞吐量太低了。肯定要用多线程去并发处理,压测消费者4 核 8G 单机,32 条线程,最高每秒可以处理上千条消息

消息队列延迟以及过期失效

消费端出了问题,不消费了或者消费极其慢。接着坑爹了,你的消息队列集群的磁盘都快写满了 ,都没人消费,怎么办?积压了几个小时,rabbitmq设置了消息过期时间后就没了,怎么办?

例如:

  • 每次消费之后都要写 mysql,结果mysql挂了,消费端 hang 不动了。

  • 消费者本地依赖的一个东西挂了,导致消费者挂了。

  • 长时间没处理消费,导致 mq 写满了。

场景:几千万条数据再 MQ 里积压了七八个小时

快速处理积压的消息

一个消费者一秒是 1000 条,一秒 3 个消费者是 3000 条,一分钟是 18W 条,1000 多 W 条需要一个小时恢复。

步骤:

  • 先修复 consumer 的问题,确保其恢复消费速度,然后将现有的 consumer 都停掉

  • 新建一个topic,partition是原来的 10 倍,临时建立好原先 10 倍或者 20 倍的 queue 数量

  • 然后写一个临时的分发数据的 consumer 程序,这个程序部署上去消费积压的数据,消费之后不做耗时的处理,直接均匀轮询写入临时建立好的 10 倍数量的 queue

  • 接着临时征用 10 倍的机器来部署 consumer,每一批 consumer 消费一个临时 queue 的数据

  • 这种做法相当 于是临时将 queue 资源和 consumer 资源扩大 10 倍,以正常 10 倍速度

  • 等快速消费完积压数据之后,恢复原先部署架构 ,重新用原先的 consumer机器消费消息

原来 3 个消费者需要 1 个小时可以搞定,现在 30 个临时消费者需要 10 分钟就可以搞定。

如果用的 rabbitmq,并且设置了过期时间,如果此消费在 queue里积压超过一定的时间会被 rabbitmq清理掉,数据直接搞丢。
这个时候开始写程序,将丢失的那批 数据查出来,然后重新灌入mq里面,把白天丢的数据补回来。

如果消息积压mq,长时间没被处理掉,导致mq快写完满了,你临时写一个程序,接入数据来消费,写到一个临时的mq里,再让其他消费者慢慢消费 或者消费一个丢弃一个,都不要了,快速消费掉所有的消息,然后晚上补数据。

如何设计消息队列中间件架构

  • mq要支持可伸缩性,快速扩容。设计一个分布式的 MQ,broker->topic->partition,每个 partition 放一个机器,就存一部分数据。如果现在资源不够,给 topic 增加 partition ,然后做数据迁移,增加机器。

  • mq数据落磁盘,避免进程挂了数据丢了,顺序写,这样就没有磁盘随机读写的寻址开销,磁盘顺序读写的性能是很高的,这个就是 kafka的思路。

  • mq高可用性。多副本->leader & follower-> broker 挂了重新选举 leader 对外提供服务

  • 支持数据 0 丢失。

【面试题专栏】

2020年Java多线程与并发系列22道高频面试题解析

从阿里、腾讯的面试真题中总结了这11个Redis高频面试题

2020年Java基础高频面试题汇总(1.4W字详细解析)

全网最全Spring系列面试题129道(附答案解析)

2万字Java并发编程面试题整理(含答案,建议收藏)

85道Java微服务面试题整理(助力2020面试)

【2020年大厂面试必备】JVM与性能调优知识点整理

2019年面试官最喜欢问的28道ZooKeeper面试题

2020面试还搞不懂MyBatis?看看这27道面试题!(含答案和思维导图)

Spring Cloud+Spring Boot高频面试题解析

2019年常见的Linux面试题及答案解析,哪些你还不会?

2019年常见Elasticsearch面试题答案解析

18道kafka高频面试题哪些你还不会?(含答案和思维导图)

2019年12道RabbitMQ高频面试题你都会了吗?(含答案解析)

2019年Dubbo你掌握的如何?快看看这30道高频面试题!

fec54079da25049bc4fda11449de3a3e.png

a6cf81360bad1d1b6638a36413d4064f.png 你在看吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 星期顺序_第8周 【项目3-顺序串算法】

/**Copyright (c)2017,烟台大学计算机与控制工程学院*All rights reservrd.*作者:李欣豪*完成时间:2017年12月14日*版本号:v1.0*问题描述:采用顺序存储方式存储串,实现下列算法并测试:(1)试编写算法实现将…

[ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify uniq

angularjs 使用ng-repeat报错 <div ng-init"words [高校,高校,高校]" ng-repeat"word in words">{{word}} </div> [ngRepeat:dupes] Duplicates in a repeater are not allowed. Use track by expression to specify unique keys 发现是因为相…

java 并列排名,178. 分数排名

题目描述编写一个 SQL 查询来实现分数排名。如果两个分数相同&#xff0c;则两个分数排名(Rank)相同。请注意&#xff0c;平分后的下一个名次应该是下一个连续的整数值。换句话说&#xff0c;名次之间不应该有“间隔”。-----------| Id | Score |-----------| 1 | 3.50 || 2 |…

编写高质量代码改善C#程序的157个建议——建议130:以复数命名枚举类型,以单数命名枚举元素...

建议130&#xff1a;以复数命名枚举类型&#xff0c;以单数命名枚举元素 枚举类型应该具有负数形式&#xff0c;它表达的是将一组相关元素组合起来的语义。比如&#xff1a; enum Week{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday} 在这里&#xff0c;Week对于星…

python 定义变量_第三章(第2节):变量和常量

变量的概念基本上和初中代数的方程变量是一致的&#xff0c;只是在计算机程序中&#xff0c;变量不仅可以是数字&#xff0c;还可以是任意数据类型&#xff0c;比如我们上节课刚刚学过的基本数据类型或者我们后面要学的自定义数据类型。所谓常量就是不能改变的变量&#xff0c;…

OpenStack Weekly Rank 2015.08.24

Module  Reviews  Drafted Blueprints  Completed Blueprints  Filed Bugs  Resolved Bugs Cinder  5      1          1            6       13 Swift   10     N/A         N/A           8   …

php如何判断是否新数据类型,php中如何判断变量的数据类型呢?

摘要:下文讲述PHP中判断变量数据类型的方法分享&#xff0c;如下所示&#xff1b;实现思路:方式1&#xff1a;使用gettype函数返回变量的数据类型gettype函数可返回"boolean”、“integer”、“double”(float类型会返回“double”&#xff0c;而非“float”)、“string”…

pytorch卷积神经网络_资源|卷积神经网络迁移学习pytorch实战推荐

点击上方“AI遇见机器学习”&#xff0c;选择“星标”公众号重磅干货&#xff0c;第一时间送达一、资源简介这次给大家推荐一篇关于卷积神经网络迁移学习的实战资料&#xff0c;卷积神经网络迁移学习简单的讲就是将一个在数据集上训练好的卷积神经网络模型通过简单的调整快速移…

php 删除服务器上的文件,php如何删除服务器文件

在php中可以使用“ftp_delete”函数删除服务器文件&#xff0c;其语法是“ftp_delete(ftp_connection,file)”&#xff0c;参数“ftp_connection”表示要使用的FTP连接&#xff0c;参数“file”表示要删除的文件的路径。推荐&#xff1a;《PHP视频教程》PHP ftp_delete() 函数定…

企业生产环境下不同业务的linux分区建议

常规分区方案&#xff1a; /boot: 100M swap:内存的1至1.5倍 / : 剩余硬盘大小 DB及存储&#xff1a;有大量重要的数据 /boot : 100M swap: 内存的1至1.5倍&#xff0c;如果内存大于等于16G&#xff0c;分为8G至16G / &#xff1a;50-200G /data&#xff1a; 硬盘剩余所有大小…

python爬虫ip限制_简单爬虫,突破IP访问限制和复杂验证码,小总结

简单爬虫&#xff0c;突破复杂验证码和IP访问限制好吧&#xff0c;看题目就知道我是要写一个爬虫&#xff0c;这个爬虫的目标网站有一些反爬取意识&#xff0c;所以就有了本文了。我先说说场景吧&#xff1a;由于工作需要&#xff0c;平时有一大堆数据需要在网上查询&#xff0…

php使用双引号,PHP编程双引号怎么使用

PHP编程双引号怎么使用PHP用单引号代替双引号来包含字符串&#xff0c;这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量&#xff0c;单引号则 不会&#xff0c;注意&#xff1a;只有echo能这么做&#xff0c;它是一种可以把多个字符串当作参数的“函数”(译注&…

IOS UITextView自适应高度

LOFTER app需要实现了一个类似iPhone短信输入框的功能&#xff0c;它的功能其实蛮简单&#xff0c;就是&#xff1a;【UITextView的高度随着内容高度的变化而变化】。实现思路应该是&#xff1a; 在UITextView的textChanged事件响应代码里计算输入内容的高度&#xff0c;然后如…

python获取mac窗口程序内容_在Mac OS X中获取当前活动窗口/文档的标题

在Objective-C&#xff0c;简单的答案&#xff0c;用少量可可和大多Carbon Accessibility API是&#xff1a;// Get the process ID of the frontmost application.NSRunningApplication* app [[NSWorkspace sharedWorkspace]frontmostApplication];pid_t pid [app processId…

php实战搭建博客,yii2项目实战-博客管理平台的搭建

作者&#xff1a;白狼 出处&#xff1a;http://www.manks.top/document/yii2-blog-manage.html 本文版权归作者&#xff0c;欢迎转载&#xff0c;但未经作者同意必须保留此段声明&#xff0c;且在文章页面明显位置给出原文连接&#xff0c;否则保留追究法律责任的权利。相信看了…

ACM学习历程—HDU2068 RPG的错排(组合数学)

Description 今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁。RPG给他机会让他猜猜&#xff0c;第一次猜&#xff1a;R是公主&#xff0c;P是草儿&#xff0c;G是月野兔&#xff1b;第二次猜&#xff1a;R…

python训练手势分类器_机器学习零基础?手把手教你用TensorFlow搭建图像分类器|干货...

编者按&#xff1a;Pete Warden是TensorFlow移动团队的技术负责人。曾在Jetpac担任首次技术官。Jetpac的深度学习技术经过优化&#xff0c;可在移动和嵌入式设备上运行。该公司已于2014年被谷歌收购。Pete还曾在苹果公司从事GPU优化领域的图像处理工作&#xff0c;并为OReilly撰…

汉军Hundre考勤数据库数据表分析总结

ar-ATT为考勤刷卡数据库 Att-carRecord为刷卡流水&#xff0c;但是插入时需要根据workrecord表中数据进行判断 ATT-workrecord为运算后明细表存放位置&#xff0c;每次运算后重新生成。 刷卡数据更改方法&#xff1a; 查询序列&#xff1a;SELECT * FROM [AR_att].[dbo].[ATT_…

python内存消耗大吗_如何减少python内存的消耗?

标签&#xff1a;Python 打算删除大量涉及像C和C语言那样的复杂内存管理。当对象离开范围&#xff0c;就会被自动垃圾收集器回收。然而&#xff0c;对于由Python 开发的大型且长期运行的系统来说&#xff0c;内存管理是不容小觑的事情。在这篇博客中&#xff0c;我将会分享关于…

php invalid access,PHP出错消息PHP has encountered an Access Violation at XXXXXXXX 如何解决?...

1、是否zend所需的dll文件所在目录给的权限不够&#xff0c;必须有读取和运行的权限2、如果使用的是windows系统&#xff0c;是否设置过应用池&#xff0c;比如池https://anlijun.co中限制了什么