[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-jira-kak-rabotaet-klasterizatsiya-v-jira-data-center-i-kak-eto-vliyaet-na-plaginy":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":19,"progress":20,"seo":21},1061,"kak-rabotaet-klasterizatsiya-v-jira-data-center-i-kak-eto-vliyaet-na-plaginy",27,"jira","Jira","📋","Как работает кластеризация в Jira Data Center и как это влияет на плагины?","Jira Data Center — кластерное решение, где несколько нод Jira работают за балансировщиком нагрузки, разделяя общую БД и файловую систему, что предъявляет специфические требования к плагинам.\n\n### Архитектура DC кластера\n\n```\n                    ┌──────────────────┐\n                    │  Load Balancer   │\n                    └───────┬──────────┘\n              ┌─────────────┼─────────────┐\n              ▼             ▼             ▼\n         ┌────────┐    ┌────────┐    ┌────────┐\n         │ Node 1 │    │ Node 2 │    │ Node 3 │\n         │ Jira   │    │ Jira   │    │ Jira   │\n         │+Plugin │    │+Plugin │    │+Plugin │\n         └───┬────┘    └───┬────┘    └───┬────┘\n             │   Hazelcast │             │\n             └──────┬──────┘─────────────┘\n                    │\n              ┌─────┴─────┐\n              │ Shared DB  │     ┌─────────────────┐\n              │ (Postgres) │     │ Shared FS (NFS)  │\n              └────────────┘     └─────────────────┘\n```\n\n### Влияние на плагины\n\n```java\n\u002F\u002F НЕПРАВИЛЬНО — состояние в памяти ноды\n@Named\npublic class BadService {\n    \u002F\u002F Этот кэш локальный — данные рассинхронизируются между нодами\n    private final Map\u003CString, Config> localCache = new ConcurrentHashMap\u003C>();\n}\n\n\u002F\u002F ПРАВИЛЬНО — данные в общей БД или распределённом кэше\n@Named\npublic class GoodService {\n    private final ActiveObjects ao;\n    private final CacheManager cacheManager;\n\n    @Inject\n    public GoodService(@ComponentImport ActiveObjects ao,\n                       @ComponentImport CacheManager cacheManager) {\n        this.ao = ao;\n        this.cacheManager = cacheManager;\n    }\n}\n```\n\n### Распределённые блокировки (ClusterLockService)\n\n```java\n@Named\npublic class ScheduledTaskService {\n\n    private final ClusterLockService clusterLockService;\n\n    @Inject\n    public ScheduledTaskService(\n            @ComponentImport ClusterLockService clusterLockService) {\n        this.clusterLockService = clusterLockService;\n    }\n\n    public void runExclusiveTask() {\n        ClusterLock lock = clusterLockService.getLockForName(\"my-plugin-daily-task\");\n        if (lock.tryLock()) {\n            try {\n                performDailyCleanup();\n            } finally {\n                lock.unlock();\n            }\n        } else {\n            log.debug(\"Задача уже выполняется на другой ноде\");\n        }\n    }\n}\n```\n\n### Чек-лист кластерной совместимости\n\n| Требование | Проверка |\n|---|---|\n| Нет in-memory state | Все данные в БД или distributed cache |\n| Нет локальных файлов | Используется shared filesystem или БД |\n| Нет java.util.Timer | Используется SAL PluginScheduler или ClusterLockService |\n| Нет статических кэшей | Используется CacheManager |\n| Scheduled tasks идемпотентны | Безопасно выполнить на любой ноде |\n| Plugin settings | Через SAL PluginSettingsFactory (хранятся в БД) |\n\n### Частые ошибки\n\n- Локальный ConcurrentHashMap как кэш — рассинхронизация между нодами\n- java.util.Timer или ScheduledExecutorService — задача выполняется на каждой ноде одновременно\n- Запись во временные локальные файлы — другая нода их не видит\n- Не тестировать на кластере из 2+ нод перед релизом\n\n### Как используется в 2026\n\n- Кластерная совместимость — обязательное требование для публикации на Atlassian Marketplace\n- Типичные кластеры: 2-4 ноды для средних компаний, 8+ нод для крупных enterprise\n- Atlassian предоставляет DC Performance Toolkit для нагрузочного тестирования плагинов в кластере\n- Zero-downtime upgrades предъявляют дополнительные требования к обратной совместимости плагинов\n\n> **На собеседовании:** это senior-вопрос, показывающий понимание распределённых систем. Ключевое: stateless-дизайн, CacheManager вместо ConcurrentHashMap, ClusterLockService для эксклюзивных задач. Маркер `atlassian-data-center-compatible=true` обязателен. Hazelcast — движок распределённого кэша и messaging в Jira DC.","","senior",[15,16,17,18,7],"jira-data-center","clustering","caching","architecture",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":35,"featuredSnippetReady":36},"Кластеризация в Jira Data Center и влияние на плагины — Gymterview","Кластер Jira DC: Hazelcast, shared DB\u002FFS, stateless-дизайн плагинов, ClusterLockService, CacheManager, межнодовые сообщения. Чек-лист совместимости.","Кластеризация Jira DC: stateless плагины, распределённые блокировки — Gymterview","Как кластер Jira DC влияет на плагины: stateless-дизайн, CacheManager, ClusterLockService, чек-лист совместимости.",[27,28,29,30,31,32,33,34],"Jira Data Center","кластеризация","Hazelcast","ClusterLockService","CacheManager","stateless","distributed cache","Jira DC plugin","Jira DC — кластер из нескольких нод за Load Balancer с общей БД и файловой системой, Hazelcast для distributed cache и messaging. Плагины должны быть stateless: CacheManager вместо ConcurrentHashMap, ClusterLockService для эксклюзивных задач, SAL PluginScheduler вместо java.util.Timer. Маркер atlassian-data-center-compatible=true обязателен для Marketplace.",true]