• 刘大明
    2019-07-25
    老师请问一下,这种异步调用,我们为啥不用中间件呢。比如说kafka mq之类的。

    作者回复: 异步调用可以分为进程内进程外两类,主要看异步调用的规模和量,量小进程内处理也没问题,量大考虑进程外的甚至分布式的异步处理。进程内的异步调用可以直接采用Spring Async机制,进程外的异步处理,可以考虑引入kafka等mq。

     1
     5
  • 旭东
    2020-02-01
    异步操作不能和调用者放到同一个bean的原因没有解释,老师能解释下就更好了

    作者回复: 前面回复有说明,请参考stackoverflow上的这个帖子的第一个解释,很详细:
    https://stackoverflow.com/questions/24898547/spring-async-method-called-from-another-async-method。

    根源是spring AOP机制的局限性造成。

    
     1
  • 🐛
    2019-08-15
    老师,您好,为什么异步的方法不能和调用异步方法的方法在一个类呢?

    作者回复: 你好,这个跟spring async/aop的内部实现机制有关,具体可以参考stackoverflow上的一个回答,解释的比较清楚:https://stackoverflow.com/questions/24898547/spring-async-method-called-from-another-async-method

    
     1
  • 韶年
    2019-08-07
    老师,我怎么知道在我的系统中,线程池该设置多大?

    作者回复: 你好,每个应用/系统的场景和流量模式各不相同,所以没有所谓的标准设置,一般都是预设一个估计值(例如可以设置成CPU的核数),然后做好测试和生产监控,根据实际测试和监控数据再进行调整。实际可以对接Apollo等配置中心,这样可以按需动态调整设置。

    
    
  • Geek_9695b4
    2019-08-05
    老师,我在看到这个视频时正好遇到类似的问题。问题是我们系统是使用多数据源动态切换的,也就是不同用户使用不同的数据源,主要思想是extends AbstractRoutingDataSource,这个数据源信息是放在请求头里面的。但是遇到一个问题,就是业务代码中使用多线程时,这个设置的动态数据源无效了,请问一下是什么原因,怎么解决比较好?

    作者回复: 你好,多数据源动态切换这类场景我还没有实际接触过,没有足够上下文所以还不清楚你的具体问题出在哪里。但是,线程级上下文信息传递的一般技术思路:1)在同一个线程里头,可以使用线程局部变量在不同类/方法间传递数据;2)如果线程有切换,那么在切换的边界需要将线程上下文数据进行复制,比如从A线程复制到B线程,这样采用在两个线程间传递数据,保证不断。具体问题建议你看源码+调试跟踪进一步分析。

     3
    
  • sayid
    2019-08-03
    老师好,为何不用Spring 事件监听模式,结合spring的异步去使用,而是自己去维护调用上下文?

    作者回复: 课程的目标是让大家不仅是知其然,而且知其所以然,所以采用代码实现自己维护调用Context,这个不复杂,工作量也不大,而且也很灵活。

    
    
  • Jxin
    2019-07-31
    1.为啥不用中间件?因为成本。a.规模量级用进程内异步难以支撑时才会采用mq实现生产消费模式。(量级够不够,就看消费能持平不,毕竟进程这消息堆积太占空间了)。b.最终一致强要求,进程内异步没玩好容易丢消息,产生中间状态数据啥的,又要写一堆定时任务去检验,自修复。
    2.看老师这个线程池的名字,感觉全部异步任务都用它了。好像也有说法是最好就用一个线程池。但是,总觉得不灵活。比如我有一些任务是io操作耗时较长的,我就喜欢单独领出来用一个线程池去承接,并根据压测指标调整线程数以提高吞吐(当然,黄金流程和其他流程我也偏向于剥离)。接着就是这个队列,作为公用线程池100个的量级是否太小了?然后最多5条线程合适吗?毕竟我配置每个线池也有5条,总的会有四五个池,合起来就20左右线程总数。核数加一还是核数*2加一?怎么去权衡。

    作者回复: 你好,回复你的第2个问题,课程案例项目中的线程池设置只是为了简单演示, 实际项目中可以根据不同处理场景分别配置多个线程池。项目中的线程池配置数据也是预估的,没有所谓经验值,实际要做好线程池的生产监控,然后根据生产实际流量情况进行调整,可以考虑对接配置中心,方便根据需要调整配置。

    
    
  • WL
    2019-07-24
    老师请问一下在ServiceHelper的syncUserAsync(String userId)方法里面有很多抛出异常的处理, 我想请问一下在异步方法里抛出异常有啥作用, 调用他的类能接catch到异步方法中抛出的异常吗?

    作者回复: 对,异步操作抛出的异常,一般在主线程里头是捕获不到的。大部分场景下,如果异步操作抛异常,捕获的话能做的就是记录错误日志,事后可以备查,或者尝试后备操作,还有就是关闭一起启用的资源,防止资源泄漏。

    
    
我们在线,来聊聊吧