JAVA_笔试
<img src="https://img2024.cnblogs.com/blog/797365/202507/797365-20250709170614073-1758317216.png"><p>1.不使用第三方组件的情况下,如何实现一个消息队列(<span style="font-family: 宋体">类似</span><span style="font-family: Calibri">kafka</span>),请详细列出设计上需要考虑的点。</p>
<table border="1" cellspacing="0">
<tbody>
<tr>
<td valign="top" width="852">
<p class="p">1.<span style="font-family: 宋体">确定需求和功能:确定消息队列的主要功能,并分析需要处理的消息类型、消息数量和消息处理的速度等因素。</span><br>2.<span style="font-family: 宋体">选择合适的架构模式:根据需求和功能,选择适合的架构模式,如 </span><span style="font-family: Calibri">Pub/Sub </span><span style="font-family: 宋体">模式、队列模式、管道模式等。</span><br>3.<span style="font-family: 宋体">设计存储方案:根据消息的特性和处理需求,选择合适的存储方案,如内存存储、磁盘存储、数据库存储等。</span><br>4.<span style="font-family: 宋体">设计消息传输协议:确定消息传输的协议,如 </span><span style="font-family: Calibri">TCP</span><span style="font-family: 宋体">、</span><span style="font-family: Calibri">UDP</span><span style="font-family: 宋体">,或 </span><span style="font-family: Calibri">HTTP </span><span style="font-family: 宋体">等。</span></p>
<p class="p">5.<span style="font-family: 宋体">实现消息处理机制:实现消息处理机制,包括消息接收、入队、出队、分发、处理等等。</span></p>
<p class="p">6.<span style="font-family: 宋体">消息确认机制:消费者需要告诉消息队列何时已经成功处理一条消息。这可以通过在消息队列中添加一个确认机制来实现。</span></p>
<p class="p">7.<span style="font-family: 宋体">错误处理机制:当消息处理失败时,需要一个错误处理机制来重新处理消息或将其发送到错误队列进行处理。</span></p>
<p class="p">8.<span style="font-family: 宋体">负载均衡机制:当有多个消费者时,需要一种负载均衡机制来分配消息。</span></p>
<p class="p">9.<span style="font-family: 宋体">支持高可用和容错:设计并实现高可用和容错机制,确保消息队列能够在面对各种异常情况下,稳定地运行。</span><br>10.<span style="font-family: 宋体">监控和管理:设计并实现监控和管理机制,方便管理员监控消息队列的状态和运行情况。</span><br>11.<span style="font-family: 宋体">支持扩展和升级:设计并实现扩展和升级机制,方便后续对消息队列的功能进行扩展和升级。</span></p>
</td>
</tr>
</tbody>
</table>
<p> </p>
<ol>
<li><span style="font-family: 宋体">一个运行在</span><span style="font-family: Calibri">jvm</span><span style="font-family: 宋体">上的系统,通过接收</span><span style="font-family: Calibri">http</span><span style="font-family: 宋体">请求,并有远程</span><span style="font-family: Calibri">rpc</span><span style="font-family: 宋体">操作和数据库的操作</span>。当这个系统出现卡顿,如何定位问题?</li>
</ol>
<p> </p>
<p>1.确定系统的问题出现是在远程服务器端还是客户端调用方。如果是远程服务出现问题。</p>
<p>(1) 远程服务器端出现卡顿现象,查看远程系统的机器服务日志。</p>
<p>(2) 对远程服务器的操作数据日志进行分析,收集服务器的错误信息。</p>
<p>① 服务器经常宕机。</p>
<p>② <span style="font-family: 宋体">服务器节点的压力值,处理数据的读写</span><span style="font-family: Calibri">I/O</span><span style="font-family: 宋体">,磁盘利用率等。</span></p>
<p>③ 收集不同时间端的服务器请求数量,进行分析系统卡顿的原因。</p>
<p>1) 线程安全问题,如并发,死锁。</p>
<p>2) 服务是单体项目,未做分布式微服务处理,用户量过大。</p>
<p>3) 服务器节点服务的数据库访问问题,后台服务的接口数据处理受否有缺陷。</p>
<p>④ 网络阻塞或者是网络安全,丢包,数据传输错误。</p>
<p>1) 网络带宽过窄。</p>
<p>2) 网络的数据流量过大。</p>
<p>3) 数据链光缆等物理设备故障。</p>
<p>4) 数据本身的报文错误。</p>
<p>5) 网络通畅问题。</p>
<p>(3) 向远程服务器的服务商家提供方提供出错信息,等待出错反馈。</p>
<p>2.客户端调用方出现数据异常。</p>
<p>(1) 前端是否限流。</p>
<p>① 流量过大使用服务拆分。</p>
<p>(2) 后端服务是否有线程请求阻塞。</p>
<p>(3) 如果服务有集群部署。</p>
<p>① 监控服务器集群节点信息。</p>
<p>(4) 数据库的数据量过大,数据查询过慢。</p>
<p>① 数据查询过慢的操作代码优化。</p>
<p>② 数据库表的优化,索引库的优化等。</p>
<p>③ 数据库的分布式处理,分区,分库,分节点,读写分离。</p>
<p>(5) 内存过载。</p>
<p>(6) 程序员的后台服务编码问题,代码处理数据性能不高。</p>
<p>3.硬件出现故障或者是性能不好。</p>
<p>(1) <span style="font-family: Calibri">CPU</span><span style="font-family: 宋体">和计算机节点的存储设备。</span></p>
<p>(2) 网络连接设备。</p>
<p>(3) 异常和安全故障。</p>
<p> </p>
<p>3.用代码实现两个超大数相加,要求函数或方法输入两个任意长度(长度可能超过所有基础类型表示的范围)的数值,能计算并输出结果</p>
<table border="1" cellspacing="0">
<tbody>
<tr>
<td valign="top" width="852">
<p><span style="font-family: Calibri">@Test</span></p>
<p> <span style="font-family: Calibri">public void testBig() {</span></p>
<p><span style="font-family: Calibri">System.out.println(bigAdd("123456789", "9999999999999999999999999"));</span></p>
<p> <span style="font-family: Calibri">}</span></p>
<p> </p>
<p> <span style="font-family: Calibri">public static String bigAdd(String a, String b) {</span></p>
<p><span style="font-family: Calibri">char[] charsA = new StringBuilder(a).reverse().toString().toCharArray();</span></p>
<p><span style="font-family: Calibri">char[] charsB = new StringBuilder(b).reverse().toString().toCharArray();</span></p>
<p> </p>
<p><span style="font-family: Calibri">int maxLength = Math.max(charsA.length, charsB.length);</span></p>
<p> </p>
<p><span style="font-family: Calibri">int[] result = new int;</span></p>
<p> </p>
<p><span style="font-family: Calibri">int temp = 0;</span></p>
<p><span style="font-family: Calibri">for (int i = 0; i <= maxLength; i++) {</span></p>
<p> <span style="font-family: Calibri">temp = result;</span></p>
<p> </p>
<p> <span style="font-family: Calibri">if (i < charsA.length) {</span></p>
<p> <span style="font-family: Calibri">temp += charsA - '0';</span></p>
<p> <span style="font-family: Calibri">}</span></p>
<p> </p>
<p> <span style="font-family: Calibri">if (i < charsB.length) {</span></p>
<p> <span style="font-family: Calibri">temp += charsB - '0';</span></p>
<p> <span style="font-family: Calibri">}</span></p>
<p> </p>
<p> <span style="font-family: Calibri">if (temp >= 10) {</span></p>
<p> <span style="font-family: Calibri">temp -= 10;</span></p>
<p> <span style="font-family: Calibri">result = 1;</span></p>
<p> <span style="font-family: Calibri">}</span></p>
<p> </p>
<p> <span style="font-family: Calibri">result = temp;</span></p>
<p> </p>
<p><span style="font-family: Calibri">}</span></p>
<p> </p>
<p><span style="font-family: Calibri">StringBuilder sb = new StringBuilder();</span></p>
<p><span style="font-family: Calibri">boolean flag = true;</span></p>
<p> </p>
<p><span style="font-family: Calibri">for (int i = maxLength; i >= 0; i--) {</span></p>
<p> <span style="font-family: Calibri">if (result == 0 && flag) {</span></p>
<p> <span style="font-family: Calibri">continue;</span></p>
<p> <span style="font-family: Calibri">}</span></p>
<p> </p>
<p> <span style="font-family: Calibri">flag = false;</span></p>
<p> <span style="font-family: Calibri">sb.append(result);</span></p>
<p><span style="font-family: Calibri">}</span></p>
<p> </p>
<p><span style="font-family: Calibri">return sb.toString();</span></p>
<p> </p>
<p> <span style="font-family: Calibri">}</span></p>
</td>
</tr>
</tbody>
</table><br><br>
来源:https://www.cnblogs.com/liaowanzhong/p/18975271
頁:
[1]