『C++』2020年最新阿里C/C++ Linux后台开发面试题及答案( 三 )


建立新的queue , 消费者同时订阅新旧queue
生产者端缓存数据 , 在mq被消费完后再发送到mq
打破发送循环条件 , 设置合适的qos值 , 当qos值被用光 , 而新的ack没有被mq接收时 , 就可以跳出发送循环 , 去接收新的消息;消费者主动block接收进程 , 消费者感受到接收消息过快时主动block , 利用block和unblock方法调节接收速率 , 当接收线程被block时 , 跳出发送循环 。
新建一个topic , partition是原来的10倍;然后写一个临时的分发数据的consumer程序 , 这个程序部署上去消费积压的数据 , 消费之后不做耗时的处理 , 直接均匀轮询写入临时建立好的10倍数量的queue;接着临时征用10倍的机器来部署consumer , 每一批consumer消费一个临时queue的数据;等快速消费完积压数据之后 , 得恢复原先部署架构 , 重新用原先的consumer机器来消费消息;
10、一个线程池正在处理服务如果忽然断电该怎么办?队列实现持久化储存 , 下次启动自动载入 。
但是实际需要看情况 , 大体思路是这样 。
添加标志位 , 未处理 0 , 处理中 1 , 已处理 2 。 每次启动的时候 , 把所有状态为 1 的 ,置为 0 。 或者定时器处理
关键性的应用就给电脑配个 UPS 。
11、红黑树的特点?(1)每个节点或者是黑色 , 或者是红色 。
(2)根节点是黑色 。
(3)每个叶子节点(NIL)是黑色 。[注意:这里叶子节点 , 是指为空(NIL或NULL) 的叶子节点!

【『C++』2020年最新阿里C/C++ Linux后台开发面试题及答案】(4)如果一个节点是红色的 , 则它的子节点必须是黑色的 。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点 。 [这里指到 叶子节点的路径

12、分布式服务调用的特点?分布式服务调用可以实现跟踪系统 , 可以在业务日志中添加调用链ID , 各个环节RPC 均添加调用时延QPS等 。
非业务组件应该少加入业务代码 , 服务调用采用买点 , 也会采用配置采样率方式 , 买点 即当前节点的上下文信息 , 包含TraceId , RPCId , 开始结束时间 , 类型 , 协议 , 调用 方IP , 端口 , 服务名等 , 以及其他异常信息 , 报文等扩展 , 日志采用离线+实时的如flume 结合kafka等 , 应按照TraceId汇总日志后按RPCId顺序整理 。
13、如何编写高质量C++代码的建议?1) extern C的作用是当程序被C++编译器编译时 , 让后续的链接器以C方式来寻找函数 , 方便C++程序调用C程序 。
2) C++风格注释形如:// .... , 推荐使用这样的注释 。 但是 , 头文件说明和函数默认参数的注释 , 还是用C风格(/**/)的较好 。
3) 不要写与编译器依赖紧密的代码
例如:printf(\"a %d %d\" p() q()) , p和 q函数的执行前后顺序与编译器实现相关 , 应当避免此类代码 。 类似的还有 c = p() * q() * r() 。
4) 尽量用const , enum , inline代替#define
inline关键字用在函数调用展开 , 在类声明中定义并且实现的函数自动为内联函数 。 如果需要将其他函数定义为内联函数 , 则需要在函数实现头声明此关键字 , 才让编译器尝试去内联 , 至于具体是否内联 , 还要求函数体满足一定条件才行 , 总体原则是短小精悍 。
在使用define的场合 , 注意用()来保护宏函数 。 例如:#define MAX(a b) ((a) > (b) ? (a) : (b))
5) struct在C和C++下的异同C语言的struct不允许定义函数程序 , 而C++语言下的struct可以 。
6) 所有数据成员一律为private类型 。 如果派生类需要用到 , 那么在用到的时候再将其改为protect类型 , 否则 , 一律声明为private类型 , 对外隐藏 。 在具体声明时 , 可以按类型来多段声明 , 比如私有控件 , 来一个private , 私有数据来另外一个private 。


推荐阅读