本人发现网上虽然有不少Dubbo面试题及答案,但第一未必全,第二未必有答案,第三虽然有答案,但未必能在面试中说,所以在本文里,会不断收集各种面试题,并站在面试官的立场上,给出我自己的答案

如果不背 Dubbo面试题的答案,肯定面试会挂!

这套Dubbo面试题大全,希望对大家有帮助哈~

博主已将以下这些面试题整理成了一个Java面试手册,是PDF版的

1、RPC框架需要解决的问题?

1、 如何确定客户端和服务端之间的通信协议?

2、 如何更高效地进行网络通信?

3、 服务端提供的服务如何暴露给客户端?

4、 客户端如何发现这些暴露的服务?

5、 如何更高效地对请求对象和响应结果进行序列化和反序列化操作?

2、Dubbo 支持哪些协议,每种协议的应用场景,优缺点?

1、 dubbo:单一长连接和 NIO 异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者。传输协议 TCP,异步, Hessian 序列化;

2、 rmi:采用 JDK 标准的 rmi 协议实现,传输参数和返回参数对象需要实现Serializable 接口,使用 java 标准序列化机制,使用阻塞式短连接,传输数据包大小混合,消费者和提供者个数差不多,可传文件,传输协议 TCP。多个短连接, TCP 协议传输,同步传输,适用常规的远程服务调用和 rmi 互操作。在依赖低版本的 Common-Collections 包, java 序列化存在安全漏洞;

3、 http:基于 Http 表单提交的远程调用协议,使用 Spring 的 HttpInvoke 实现。多个短连接,传输协议 HTTP,传入参数大小混合,提供者个数多于消费者,需要给应用程序和浏览器 JS 调用;

4、 webservice:基于 WebService 的远程调用协议,集成 CXF 实现,提供和原生 WebService 的互操作。多个短连接,基于 HTTP 传输,同步传输,适用系统集成和跨语言调用;

5、 hessian:集成 Hessian 服务,基于 HTTP 通讯,采用 Servlet 暴露服务,Dubbo 内嵌 Jetty 作为服务器时默认实现,提供与 Hession 服务互操作。多个短连接,同步 HTTP 传输, Hessian 序列化,传入参数较大,提供者大于消费者,提供者压力较大,可传文件;

6、 Redis:基于 Redis 实现的 RPC 协议

3、dubbo 通信协议 dubbo 协议为什么不能传大包;

因 dubbo 协议采用单一长连接,如果每次请求的数据包大小为 500KByte,假设网络为千兆网卡(1024Mbit=128MByte),每条连接最大 7MByte(不同的环境可能不一样,供参考),单个服务提供者的 TPS(每秒处理事务数)最大为:128MByte / 500KByte = 262。

单个消费者调用单个服务提供者的 TPS(每秒处理事务数)最大为:7MByte / 500KByte = 14。

如果能接受,可以考虑使用,否则网络将成为瓶颈。

4、一般使用什么注册中心?还有别的选择吗?

推荐使用 Zookeeper 作为注册中心,还有 Redis、Multicast、Simple 注册中心,但不推荐。

5、Dubbo 在安全机制方面是如何解决的

Dubbo 通过 Token 令牌防止用户绕过注册中心直连,然后在注册中心上管理授权。Dubbo 还提供服务黑白名单,来控制服务所允许的调用方。

6、Dubbo有哪几种集群容错方案,默认是哪种?

1、 Failover Cluster 失败自动切换,自动重试其他服务器(默认)

2、 Failfast Cluster 快速失败,立即报错,只发起一次调用

3、 Failsafe Cluster 失败安全,出现异常时,直接忽略

4、 Failback Cluster 失败自动回复,记录失败请求,定时请求

5、 Forking Cluster 并行调用多个服务器,只要一个成功即返回

6、 Broadcast Cluster 广播逐个调用所有提供者,任意一个报错则报错

7、Dubbo 支持哪些协议,每种协议的应用场景,优缺点?

1、 dubbo:单一长连接和 NIO 异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者。传输协议 TCP,异步, Hessian 序列化;

2、 rmi:采用 JDK 标准的 rmi 协议实现,传输参数和返回参数对象需要实现 Serializable 接口,使用 java 标准序列化机制,使用阻塞式短连接,传输数据包大小混合,消费者和提供者个数差不多,可传文件,传输协议 TCP。多个短连接, TCP 协议传输,同步传输,适用常规的远程服务调用和rmi 互操作。在依赖低版本的 Common-Collections包, java 序列化存在安全漏洞;

3、 webservice:基于 WebService 的远程调用协议,集成 CXF 实现,提供和原生 WebService 的互操作。多个短连接,基于 HTTP 传输,同步传输,适用系统集成和跨语言调用;

4、 http:基于 Http 表单提交的远程调用协议,使用 Spring 的HttpInvoke 实现。多个短连接,传输协议 HTTP,传入参数大小混合,提供者个数多于消费者,需要给应用程序和浏览器 JS 调用;

5、 hessian:集成 Hessian 服务,基于 HTTP 通讯,采用 Servlet 暴露服务, Dubbo 内嵌 Jetty 作为服务器时默认实现,提供与 Hession 服务互操作。多个短连接,同步 HTTP 传输, Hessian 序列化,传入参数较大,提供者大于消费者,提供者压力较大,可传文件;

6、 memcache:基于 Memcached 实现的 RPC 协议

7、 Redis:基于 Redis 实现的 RPC 协议

8、Dubbo 如何优雅停机?

Dubbo 是通过 JDK 的 ShutdownHook 来完成优雅停机的,所以如果使用 kill -9 PID 等强制关闭指令,是不会执行优雅停机的,只有通过 kill PID 时,才会执行。

9、RPC使用了哪些关键技术,从服务提供者的角度看:

当服务提供者启动的时候,需要将自己提供的服务注册到指定的注册中心,以便服务消费者能够通过服务注册中心进行查找;

当服务提供者由于各种原因致使提供的服务停止时,需要向注册中心注销停止的服务;

服务的提供者需要定期向服务注册中心发送心跳检测,服务注册中心如果一段时间未收到来自服务提供者的心跳后,认为该服务提供者已经停止服务,则将该服务从注册中心上去掉。

10、注册了多个同一样的服务,如果测试指定的某一个服务呢?

可以配置环境点对点直连,绕过注册中心,将以服务接口为单位,忽略注册中心的提供者列表。

11、dubbo 推荐用什么协议?

默认使用 dubbo 协议

12、Dubbo 核心功能有哪些?

1、 Remoting:网络通信框架,提供对多种NIO框架抽象封装,包括“同步转异步”和“请求-响应”模式的信息交换方式。

2、 Cluster:服务框架,提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。

3、 Registry:服务注册,基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

13、dubbo 推荐用什么协议?

默认使用 dubbo 协议。

14、Dubbo 的主要应用场景?

1、 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何 API 侵入。

2、 软负载均衡及容错机制,可在内网替代 F5 等硬件负载均衡器,降低成本,减少单点。

3、 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的 IP 地址,并且能够平滑添加或删除服务提供者。

Dubbo 的主要应用场景?

Dubbo 的核心功能?

主要就是如下 3 个核心功能:

1、 Remoting:网络通信框架,提供对多种 NIO 框架抽象封装,包括“同步转异步”和“请求-响应”模式的信息交换方式。

2、 Cluster:服务框架,提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。

3、 Registry:服务注册,基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

15、Dubbo服务之间的调用是阻塞的吗?

默认是同步等待结果阻塞的,支持异步调用,Dubbo 是基于 NIO 的非阻塞实现并行调用,客户端不需要启动多线程即可完成并行调用多个远程服务,相对多线程开销较小,异步调用会返回一个 Future 对象。

16、dubbo 服务集群配置(集群容错模式)

在集群调用失败时, Dubbo 提供了多种容错方案,缺省为 failover 重试。可以自行扩展集群容错策略

l Failover Cluster(默认)

失败自动切换,当出现失败,重试其它服务器。(缺省)通常用于读操作,

但重试会带来更长延迟。可通过 retries="2"来设置重试次数(不含第一次)。

<dubbo:service retries="2" cluster="failover"/>或:<dubbo:reference retries="2" cluster="failover"/>cluster="failover"可以不用写,因为默认就是 failover

Failfast Cluster

快速失败,只发起一次调用,失败立即报错。通常用于非幂等性的写操作,

比如新增记录。

dubbo:service cluster="failfast" />

或:

<dubbo:reference cluster="failfast" /> cluster="failfast"和 把 cluster="failover"、 retries="0"是一样的效果,retries="0"就是不重

Failsafe Cluster失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。

<dubbo:service cluster="failsafe" />

或:

<dubbo:reference cluster="failsafe" />

Failback Cluster

失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。

<dubbo:service cluster="failback" />

或:

<dubbo:reference cluster="failback" />

Forking Cluster并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读

操作,但需要浪费更多服务资源。可通过 forks="2"来设置最大并行数。

<dubbo:service cluster=“forking" forks="2"/>

或:

<dubbo:reference cluster=“forking" forks="2"/>

17、Dubbo 默认采用注册中心?

采用 Zookeeper

18、Dubbo 支持服务降级吗?

以通过 dubbo:reference 中设置 mock=“return null”。mock 的值也可以修改为 true,然后再跟接口同一个路径下实现一个 Mock 类,命名规则是 “接口名称+Mock” 后缀。然后在 Mock 类里实现自己的降级逻辑

19、RPC使用了哪些关键技术,主流RPC框架有哪些

20、Dubbo的管理控制台能做什么?

管理控制台主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能

21、你觉得用 Dubbo 好还是 Spring Cloud 好?

扩展性的问题,没有好坏,只有适合不适合,不过我好像更倾向于使用 Dubbo, Spring Cloud 版本升级太快,组件更新替换太频繁,配置太繁琐,还有很多我觉得是没有 Dubbo 顺手的地方。

22、Dubbo Monitor 实现原理?

Consumer端在发起调用之前会先走filter链;provider端在接收到请求时也是先走filter链,然后才进行真正的业务逻辑处理。

默认情况下,在consumer和provider的filter链中都会有Monitorfilter。

1、 MonitorFilter向DubboMonitor发送数据

2、 DubboMonitor将数据进行聚合后(默认聚合1min中的统计数据)暂存到ConcurrentMap<Statistics, AtomicReference> statisticsMap,然后使用一个含有3个线程(线程名字:DubboMonitorSendTimer)的线程池每隔1min钟,调用SimpleMonitorService遍历发送statisticsMap中的统计数据,每发送完毕一个,就重置当前的Statistics的AtomicReference

3、 SimpleMonitorService将这些聚合数据塞入BlockingQueue queue中(队列大写为100000)

4、 SimpleMonitorService使用一个后台线程(线程名为:DubboMonitorAsyncWriteLogThread)将queue中的数据写入文件(该线程以死循环的形式来写)

5、 SimpleMonitorService还会使用一个含有1个线程(线程名字:DubboMonitorTimer)的线程池每隔5min钟,将文件中的统计数据画成图表

23、RPC使用了哪些关键技术,从调用者的角度看:

服务的调用者启动的时候根据自己订阅的服务向服务注册中心查找服务提供者的地址等信息;

当服务调用者消费的服务上线或者下线的时候,注册中心会告知该服务的调用者;

服务调用者下线的时候,则取消订阅。

24、Dubbo 可以对结果进行缓存吗?

为了提高数据访问的速度。Dubbo 提供了声明式缓存,以减少用户加缓存的工作量<dubbo:reference cache=“true” />

其实比普通的配置文件就多了一个标签 cache=“true”

25、Dubbo 用到哪些设计模式?

Dubbo框架在初始化和通信过程中使用了多种设计模式,可灵活控制类加载、权限控制等功能。

工厂模式

Provider在export服务时,会调用ServiceConfig的export方法。ServiceConfig中有个字段:

private static final Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();

Dubbo里有很多这种代码。这也是一种工厂模式,只是实现类的获取采用了JDK SPI的机制。这么实现的优点是可扩展性强,想要扩展实现,只需要在classpath下增加个文件就可以了,代码零侵入。另外,像上面的Adaptive实现,可以做到调用时动态决定调用哪个实现,但是由于这种实现采用了动态代理,会造成代码调试比较麻烦,需要分析出实际调用的实现类。

装饰器模式

Dubbo在启动和调用阶段都大量使用了装饰器模式。以Provider提供的调用链为例,具体的调用链代码是在ProtocolFilterWrapper的buildInvokerChain完成的,具体是将注解中含有group=provider的Filter实现,按照order排序,最后的调用顺序是:

EchoFilter -> ClassLoaderFilter -> GenericFilter -> ContextFilter -> ExecuteLimitFilter -> TraceFilter -> TimeoutFilter -> MonitorFilter -> ExceptionFilter

更确切地说,这里是装饰器和责任链模式的混合使用。例如,EchoFilter的作用是判断是否是回声测试请求,是的话直接返回内容,这是一种责任链的体现。而像ClassLoaderFilter则只是在主功能上添加了功能,更改当前线程的ClassLoader,这是典型的装饰器模式。

观察者模式

Dubbo的Provider启动时,需要与注册中心交互,先注册自己的服务,再订阅自己的服务,订阅时,采用了观察者模式,开启一个listener。注册中心会每5秒定时检查是否有服务更新,如果有更新,向该服务的提供者发送一个notify消息,provider接受到notify消息后,即运行NotifyListener的notify方法,执行监听器方法。

动态代理模式

Dubbo扩展JDK SPI的类ExtensionLoader的Adaptive实现是典型的动态代理实现。Dubbo需要灵活地控制实现类,即在调用阶段动态地根据参数决定调用哪个实现类,所以采用先生成代理类的方法,能够做到灵活的调用。生成代理类的代码是ExtensionLoader的createAdaptiveExtensionClassCode方法。代理类的主要逻辑是,获取URL参数中指定参数的值作为获取实现类的key。

26、Dubbo 如何优雅停机?

Dubbo 是通过 JDK 的 ShutdownHook 来完成优雅停机的,所以如果使用kill -9 PID 等强制关闭指令,是不会执行优雅停机的,只有通过 kill PID 时,才会执行。

27、RPC使用了哪些关键技术,NIO通信

出于并发性能的考虑,传统的阻塞式 IO 显然不太合适,因此我们需要异步的 IO,即 NIO。Java 提供了 NIO 的解决方案,Java 7 也提供了更优秀的 NIO.2 支持。可以选择Netty或者MINA来解决NIO数据传输的问题。

28、在使用过程中都遇到了些什么问题?

如序列化问题。

29、集群容错怎么做?

读操作建议使用 Failover 失败自动切换,默认重试两次其他服务器。写操作建议使用 Failfast 快速失败,发一次调用失败就立即报错。

30、Dubbo 超时时间怎样设置?

Dubbo 超时时间设置有两种方式:

服务提供者端设置超时时间,在 Dubbo 的用户文档中,推荐如果能在服务端多配置就尽量多配置,因为服务提供者比消费者更清楚自己提供的服务特性。

服务消费者端设置超时时间,如果在消费者端设置了超时时间,以消费者端为主,即优先级更高。因为服务调用方设置超时时间控制性更灵活。如果消费方超时,服务端线程不会定制,会产生警告。

更多 Dubbo 面试题70道

01、Dubbo 集群提供了哪些负载均衡策略?

02、RPC的实现基础?

03、dubbo 通信协议 dubbo 协议适用范围和适用场景

04、Dubbo 是什么?

05、Dubbo 默认采用注册中心?

06、Dubbo SPI 和 Java SPI 区别?

07、Dubbo 有些哪些注册中心?

08、Dubbo 超时时间怎样设置?

09、Dubbo telnet 命令能做什么?

10、Dubbo 和 Spring Cloud 有什么哪些区别?

11、你觉得用 Dubbo 好还是 Spring Cloud 好?

12、Dubbo Monitor 实现原理?

13、RPC使用了哪些关键技术,从调用者的角度看:

14、Dubbo 可以对结果进行缓存吗?

15、Dubbo 用到哪些设计模式?

16、Dubbo 如何优雅停机?

17、RPC使用了哪些关键技术,NIO通信

18、在使用过程中都遇到了些什么问题?

09、集群容错怎么做?

20、Dubbo 超时时间怎样设置?

21、Dubbo集群提供了哪些负载均衡策略?

22、Dubbo 服务器注册与发现的流程?

23、同一个服务多个注册的情况下可以直连某一个服务吗?

24、默认使用什么序列化框架,你知道的还有哪些?

25、你还了解别的分布式框架吗?

26、Dubbo 的使用场景有哪些?

27、Dubbo 的注册中心集群挂掉,者和订阅者之间还能通信么?

28、同一个服务多个注册的情况下可以直连某一个服务吗?

29、默认使用什么序列化框架,你知道的还有哪些?

30、Dubbo 和 Dubbox 之间的区别?

31、Dubbo 集群容错有几种方案?

32、Dubbo 的注册中心集群挂掉,发布者和订阅者之间还能通信么?

33、Dubbo 能集成 SpringBoot 吗?

34、Dubbo 支持哪些协议,每种协议的应用场景,优缺点?

35、Dubbo 和 Spring Cloud 的关系?

36、dubbo 推荐用什么协议?

37、Dubbo 核心组件有哪些?

08、如何解决服务调用链过长的问题?

39、Dubbo 使用过程中都遇到了些什么问题?

40、同一个服务多个注册的情况下可以直连某一个服务吗?

41、Dubbo 服务器注册与发现的流程?

42、Dubbo 的默认集群容错方案?

43、RPC使用了哪些关键技术,动态代理

44、dubbo 服务负载均衡策略?

45、Dubbo的集群容错方案有哪些?

46、Dubbo 和 Dubbox 之间的区别?

47、默认使用什么序列化框架,你知道的还有哪些?

48、RPC使用了哪些关键技术,RMI

49、Dubbo 的注册中心集群挂掉,发布者和订阅者之间还能通信么?

50、Dubbo的集群容错方案有哪些?

51、RPC使用了哪些关键技术,序列化

52、Dubbo 支持哪些序列化方式?

53、说说核心的配置有哪些?

54、Dubbo集群提供了哪些负载均衡策略?

55、Dubbo 使用的是什么通信框架?

56、服务调用是阻塞的吗?

57、dubbo 在安全机制方面如何解决的?

58、Dubbo 超时时间怎样设置?

59、Dubbo 的注册中心集群挂掉,者和订阅者之间还能通信么?

60、Dubbo telnet 命令能做什么?

61、你还了解别的分布式框架吗?

62、在使用过程中都遇到了些什么问题?

63、Dubbo 超时时间怎样设置?

64、同一个服务多个注册的情况下可以直连某一个服务吗?

65、服务调用是阻塞的吗?

66、Dubbo 和 Spring Cloud 的区别?

67、服务读写推荐的容错策略是怎样的?

68、默认使用的是什么通信框架,还有别的选择吗?

69、Dubbo 如何优雅停机?

70、Dubbo 集群容错有几种方案?

如果不背 Dubbo面试题的答案,肯定面试会挂!

这套Dubbo面试题大全,希望对大家有帮助哈~

博主已将以下这些面试题整理成了一个Java面试手册,是PDF版的

110道 Dubbo面试题及答案(持续更新)相关推荐

  1. 「高级java工程师」常见面试题及其答案(持续更新)

    「java工程师」常见面试题及其答案请见: 「java工程师」常见面试题及其答案(持续更新)_好人老李的博客-CSDN博客 目录 java基础 常用的 jvm 调优方法? OOM的常见场景及其原因.解 ...

  2. 「java工程师」常见面试题及其答案(持续更新)

    「高级java工程师」常见面试题及其答案: 「高级java工程师」常见面试题及其答案(持续更新)_好人老李的博客-CSDN博客 目录 java基础 面向对象与面向过程的区别? JRE.JDK.JVM的 ...

  3. 100道 Dubbo面试题及答案(2021最新)

    Redis面试题及答案[2021最新版]Dubbo面试题大全(2021版),发现网上很多Dubbo面试题都没有答案,所以花了很长时间搜集,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小 ...

  4. 70道Dubbo面试题及答案(最新整理)

    Dubbo面试题及答案[最新版]Dubbo面试题大全(2021版),发现网上很多Dubbo面试题及答案整理都没有答案,所以花了很长时间搜集,本套Dubbo面试题大全 如果不背 Dubbo面试题的答案, ...

  5. 110道 Elasticsearch面试题及答案(持续更新)

    最新Elasticsearch面试题[附答案解析]ES面试题及答案,ES最新面试题及答案,ES面试题新答案已经全部更新完了,有些答案是自己总结的,也有些答案是在网上搜集整理的.这些答案难免会存在一些错 ...

  6. 110道 Redis面试题及答案(最新整理)

    最新Redis面试题及答案[附答案解析]Redis面试题及答案,Redis最新面试题及答案,Redis面试题新答案已经全部更新完了,有些答案是自己总结的,也有些答案是在网上搜集整理的.这些答案难免会存 ...

  7. 史上最全40道Dubbo面试题及答案

    其实关于Dubbo的面试题,我觉得最好的文档应该还是官网,因为官网有中文版,照顾了很多阅读英文文档吃力的小伙伴.但是官网内容挺多的,于是这里就结合官网和平时面试被问的相对较多的题目整理了一下. 1,说 ...

  8. 最新 30 道 Dubbo 面试题及答案

    Spring Eureka 从开源转变为闭源,Consul 正在崛起,而 Dubbo 又开始重新更新.目前市场上仍有不少公司使用dubbo我们也需要继续学习. 1.为什么要用Dubbo? 随着服务化的 ...

  9. 30道Dubbo面试题及答案

    Q1:服务调用超时问题怎么解决 A: 消费者调用服务超时会引起服务降级的发生,即从发出调用请求到获取到提供者的响应结果 这个时间超出了设定的时限.默认服务调用超时时限为 1 秒.可以在消费者端与提供者 ...

最新文章

  1. ural(Timus) 1463. Happiness to People!
  2. [Java基础] 深入jar包:从jar包中读取资源文件
  3. 使用Python将Excel中的数据导入到MySQL
  4. 开机启动简易收集面板并最小化
  5. win10恢复出厂设置_电脑Win10系统恢复出厂设置
  6. 在Windows上使用Git和GitHub
  7. python读conf配置文件完成登录_python conf配置文件
  8. WPF使用PictureBox
  9. WIFI密码破解笔记
  10. 斯坦福NLP名课带学详解 | CS224n 第14讲 - Transformers自注意力与生成模型(NLP通关指南·完结)
  11. OpenCms显示默认作者
  12. 08-22 CDR数据时钟恢复电路
  13. python数据分组聚合案例_《利用Python进行数据分析》十章·数据聚合与分组运算·学习笔记(二)...
  14. android模拟器开启vt,逍遥安卓模拟器怎样打开VT模式 VT虚拟化设置办法
  15. DDD 战术模型之聚合
  16. 学校教室计算机室云课堂软件,专注云教室教育培训云课堂的NC个人云桌面
  17. lol-----寒冰射手-----艾希
  18. AD域创建及加入域的办法
  19. Excel - 选择性粘贴和单元格引用规则
  20. 决策树算法的理论和实践

热门文章

  1. tomcat一键启停shell脚本
  2. php 开发高德地图地理围栏,移动端地理围栏
  3. UG\NX二次开发 加密锁(加密狗)加密exe
  4. 图像语义分割(一):何为语义分割
  5. 【网络】网卡的offload概念
  6. 好惨!这些院校全日制研究生也不提供宿舍了!
  7. hmr webpack 不编译_Webpack的HMR原理分析
  8. Matplotlib雷达图、三维饼状图
  9. 大话设计模式笔记(二)——商品促销 策略模式
  10. Spring整合Schedule定时任务详解