作者回复: 异步调用可以分为进程内进程外两类,主要看异步调用的规模和量,量小进程内处理也没问题,量大考虑进程外的甚至分布式的异步处理。进程内的异步调用可以直接采用Spring Async机制,进程外的异步处理,可以考虑引入kafka等mq。
作者回复: 前面回复有说明,请参考stackoverflow上的这个帖子的第一个解释,很详细: https://stackoverflow.com/questions/24898547/spring-async-method-called-from-another-async-method。 根源是spring AOP机制的局限性造成。
作者回复: 你好,这个跟spring async/aop的内部实现机制有关,具体可以参考stackoverflow上的一个回答,解释的比较清楚:https://stackoverflow.com/questions/24898547/spring-async-method-called-from-another-async-method
作者回复: 这些占位符,具体运行时的取值要看你的运行方式: 1. 如果是本地直接运行,那么取值在项目根目录的config/application.yml文件中。 2. 如果docker compose运行,那么取值在项目根目录的.env文件中。 3. 如果k8s运行,那么取值在k8s的secret中,相关配置在项目根目录的k8s/{env}/config目录中。
作者回复: 你好,每个应用/系统的场景和流量模式各不相同,所以没有所谓的标准设置,一般都是预设一个估计值(例如可以设置成CPU的核数),然后做好测试和生产监控,根据实际测试和监控数据再进行调整。实际可以对接Apollo等配置中心,这样可以按需动态调整设置。
作者回复: 对,异步操作抛出的异常,一般在主线程里头是捕获不到的。大部分场景下,如果异步操作抛异常,捕获的话能做的就是记录错误日志,事后可以备查,或者尝试后备操作,还有就是关闭一起启用的资源,防止资源泄漏。
作者回复: 对,爬楼梯看上面有参考链接解释这个问题。
作者回复: 这种复制线程上下文信息,一般在用户驱动的调用的场景下才有意义,比如跟踪用户调用产生的调用链(trace),或者传递一些用户身份标识信息等。 对于定时任务,通常是机器时钟定期触发的,一般没有必要传递线程上下文,记录日志或者产生metrics对这种场景倒是适用的。这种场景如果确实需要传递参数,建议用DB。
作者回复: 你好,多数据源动态切换这类场景我还没有实际接触过,没有足够上下文所以还不清楚你的具体问题出在哪里。但是,线程级上下文信息传递的一般技术思路:1)在同一个线程里头,可以使用线程局部变量在不同类/方法间传递数据;2)如果线程有切换,那么在切换的边界需要将线程上下文数据进行复制,比如从A线程复制到B线程,这样采用在两个线程间传递数据,保证不断。具体问题建议你看源码+调试跟踪进一步分析。
作者回复: 课程的目标是让大家不仅是知其然,而且知其所以然,所以采用代码实现自己维护调用Context,这个不复杂,工作量也不大,而且也很灵活。