प्रौद्योगिकी साझेदारी

DangerWind-RPC-framework---3 सर्वर बन्द

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

यदा यन्त्रं अफलाइनं गच्छति तदा तस्य अनेकाः समस्याः भवन्ति : पञ्जीकरणकेन्द्रात् कथं अफलाइनं नेतव्यम् ? संसाधनानाम् स्वच्छता, मुक्तिः च कथं करणीयम् ? क्लायन्ट् सेवासूचीं आकर्षयति समये स्थानीयसञ्चयस्य अपि उपयोगं करोति ।

सर्वर-यन्त्रस्य ललित-निरोधाय ShutdownHook इत्यस्य उपयोगः आवश्यकः भवति, यत् शटडाउन-हुक्-इत्यस्य तुल्यम् अस्ति, एषः हुकः एकः सूत्रः अस्ति यः संसाधनानाम् स्वच्छतायै यदा JVM निष्क्रियः भवति (अर्थात् यदा कार्यक्रमः समाप्तः भवति) तदा आह्वयते ललिततया निरुद्धं कुर्वन्तु।

  1. public void clearAll() {
  2. log.info("addShutdownHook for clearAll");
  3. // 添加了一个关闭钩子,这个钩子是一个线程,它在JVM关闭时(即程序结束时)被调用,清理资源,优雅下机
  4. Runtime.getRuntime().addShutdownHook(new Thread(() -> {
  5. try {
  6. InetSocketAddress inetSocketAddress = new InetSocketAddress(InetAddress.getLocalHost().getHostAddress(), NettyRpcServer.PORT);
  7. CuratorUtils.clearRegistry(CuratorUtils.getZkClient(), inetSocketAddress);
  8. } catch (UnknownHostException ignored) {
  9. }
  10. // 操作完整、优雅,便于释放连接资源,便于自定义清理逻辑
  11. ThreadPoolFactoryUtil.shutDownAllThreadPool();
  12. }));
  13. }

हुक थ्रेड् मध्ये, पञ्जीकरणकेन्द्रात् नोड्स विलोपयितुं तर्कं लिखितव्यं, यथा अधः दर्शितम् अस्ति:

  1. // RPC Server端 本机所注册服务的缓存
  2. private static final Set<String> REGISTERED_PATH_SET = ConcurrentHashMap.newKeySet();
  3. public static void clearRegistry(CuratorFramework zkClient, InetSocketAddress inetSocketAddress) {
  4. REGISTERED_PATH_SET.stream().parallel().forEach(p -> {
  5. try {
  6. // 是本机在ZK注册的节点
  7. if (p.endsWith(inetSocketAddress.toString())) {
  8. // 根据路径名删除节点
  9. zkClient.delete().forPath(p);
  10. }
  11. } catch (Exception e) {
  12. log.error("clear registry for path [{}] fail", p);
  13. }
  14. });
  15. log.info("All registered services on the server are cleared:[{}]", REGISTERED_PATH_SET.toString());
  16. }

पञ्जीकरणकेन्द्रे ZK मध्ये नोड् विलोपनस्य अनन्तरं थ्रेड् पूल् संसाधनं मुक्तं कर्तुं आवश्यकम् अस्ति:

  1. public static void shutDownAllThreadPool() {
  2. log.info("call shutDownAllThreadPool method");
  3. THREAD_POOLS.entrySet().parallelStream().forEach(entry -> {
  4. ExecutorService executorService = entry.getValue();
  5. // 停止接收新的任务,但已提交的任务会继续执行
  6. executorService.shutdown();
  7. log.info("shut down thread pool [{}] [{}]", entry.getKey(), executorService.isTerminated());
  8. try {
  9. // 等待线程池中的任务在指定的时间内完成。如果在指定时间内线程池未能终止,会抛出 InterruptedException
  10. executorService.awaitTermination(10, TimeUnit.SECONDS);
  11. } catch (InterruptedException e) {
  12. log.error("Thread pool never terminated");
  13. // 指定时间内线程池未能终止,立即停止所有正在执行的任务
  14. executorService.shutdownNow();
  15. }
  16. });
  17. }

थ्रेड् पूल् बन्दीकरणस्य तर्कस्य अनुकूलनं थ्रेड् पूल् संसाधनानाम् विमोचनं अधिकं सुरुचिपूर्णतया साक्षात्कर्तुं शक्नोति । भवान् नूतनानि कार्याणि स्वीकुर्वितुं त्यक्त्वा निश्चितप्रतीक्षासमये प्रस्तूयमानकार्यं निरन्तरं कर्तुं शक्नोति यदि प्रतीक्षासमयः अतिक्रान्तः भवति तर्हि थ्रेड् पूलः बलात् समाप्तः भवति ।