程序笔记   发布时间:2022-07-15  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Java面试总结,Java 小记 — RabbitMQ 的实践与思考大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

上个示例中我提到的应用场景是解耦和通知,再接着扩展,因其具备良好的缓冲性质,所以还有一个非常适合的应用场景那就是削峰。对于突如其来的极高并发请求,我们可以先瞬速地将其加入队列并回复用户一个友好提示,然后服务器可在其能承受的范围内慢慢处理,以此来防止突发的 CPU 和内存 “爆表”。

改造之后对于发送方来说当然是比较爽的,他只是将请求加入消息队列而已,处理压力都归到了消费端。接着思,这样处理有没有副作用?如果这个请求刚好是线程阻塞的,那还要加入队列慢慢排队处理,那不是完蛋了,用户要猴年马月才能得到反馈?所以针对此,我觉得应该将消费端的方法改为异步调用(即多线程)以提升吞吐量,在 Spring Boot 中的写法也非常简单:


`@Component

public class Server {



    @Async

    @RabbitHandler

    @RabbitListener(queues = MQConstant.CALL)

    public void callProcess(String messagE) throws InterruptedException {

        Thread.sleep(100);

        System.out.println(String.format("Receiver: reply("%s") Yes, I just saw your message!", messagE));

    }



}`

参照示例一的方法,我发布了 10000 条消息加入队列,且消费端的调用每次阻塞一秒,那可有意思了,什么时候能处理完?但如果开几百个线程同时处理的话,那几十秒就够了,当然具体多少合适还应根据具体的业务场景和服务器配置酌情虑。另外,别忘了配线程池:


`@Configuration

public class AsyncConfig {



    @Bean

    public Executor asyncExecutor(){

        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

        executor.setCorePoolSize(10);

        executor.setMaxPoolSize(500);

        executor.setQueueCapacity(10);



        executor.setThreadNamePrefix("MyExecutor-");



        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

        executor.initialize();

        return executor;

    }

}`

3. Exchange


RabbitMQ 可能为 N 个应用同时提供服务,要是你和你的蓝颜知己突然心有灵犀,在不同的业务上使用了同一个 routIngKey,想想就刺激。因此,队列多了自然要进行分组管理,限定好 Exchange 的规则,接下来就可以独自玩耍了。

@H_292_1@mQConstant:


`public class MQConstant {



    public static final String EXCHANGE = "YOUCLK-messaGE-EXCHANGE";



    public static final String CALL = MQConstant.EXCHANGE + ".CALL";



    public static final String ALL = MQConstant.EXCHANGE + ".#";

}`

RabbitConfig:


`@Configuration

public class RabbitConfig {



    @Bean

    public Queue callQueue() {

        return new Queue(MQConstant.CALL);

    }



    @Bean

    TopicExchange exchange() {

        return new TopicExchange(MQConstant.EXCHANGE);

    }



    @Bean

    Binding bindingExchangemessage(Queue queuemessage, TopicExchange exchangE) {

        return BindingBuilder.bind(queuemessagE).to(exchangE).with(MQConstant.ALL);

    }

}`

此时我们再去查队列 CALL,可以看到已经绑定了Exchange:

Java面试总结,Java 小记 — RabbitMQ 的实践与思考

当然 Exchange 的作用远不止如此,以上示例为 Topic 模式,除此之外还有 Direct、Headers 和 Fanout 模式,写法都差不多,感兴趣的童鞋可以去查看 “官方文档” 进行更深入了解。

4. 延时队列


延时任务的场景相信小伙伴们都接触过,特别是抢购的时候,在规定时间内未付款订单就被回收了。微信支付的 API 里面也有一个支付完成后的延时再确认消息推送,实现原理应该都差不多。

利用 RabbitMQ 实现该功能首先要了解他的两个特性,分别是 Time-To-Live Extensions 和 Dead Letter Exchanges,字面意思上就能理解个大概,一个是生存时间,一个是死信。整个过程也很容易理解,TTL 相当于一个缓冲队列,等待其过期之后消息会由 DLX 转发到实际消费队列,如此便实现了他的延时过程。

@H_292_1@mQConstant:


`public class MQConstant {



    public static final String PER_DELAY_EXCHANGE = "PER_DELAY_EXCHANGE";



    public static final String DELAY_EXCHANGE = "DELAY_EXCHANGE";



    public static final String DELAY_Call_TTL = "DELAY_Call_TTL";



    public static final String CALL = "CALL";



}`

ExpirationmessagePostProcessor:


`public class ExpirationmessagePostProcessor implements messagePostProcessor {

    private final Long ttl;



    public ExpirationmessagePostProcessor(Long ttl) {

        this.ttl = ttl;

    }



    @Override

    public message postProcessmessage(message messagE) throws AmqpException {

        message.getmessageProperties()

                .setExpiration(ttl.toString());

        return message;

    }

}`

Client:


`@Component

public class Client {



    @Autowired

    private RabbitTemplate rabbitTemplate;



    public void sendCall(String content) {

        for (int i = 1; i <= 3; i++) {

            long expiration = i * 5000;

            String message = i + "-" + content;

            System.out.println(String.format("Sender: %s", messagE));

            rabbitTemplate.convertAndSend(MQConstant.DELAY_Call_TTL, (Object) message, new ExpirationmessagePostProcessor(expiration));



        }

    }

}`

Server:

总结

一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。

这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。

最后再说几句关于招聘平台的,总之,简历投递给公司之前,请确认下这家公司到底咋样,先去百度了解下,别被坑了,每个平台都有一些居心不良的广告党等着你上钩,千万别上当!!!

提供【免费】的Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

Java全套进阶资料点这里免费领取

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。

Java面试总结,Java 小记 — RabbitMQ 的实践与思考

大佬总结

以上是大佬教程为你收集整理的Java面试总结,Java 小记 — RabbitMQ 的实践与思考全部内容,希望文章能够帮你解决Java面试总结,Java 小记 — RabbitMQ 的实践与思考所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。