Emcee
125 строк · 6.7 Кб
1import AutomaticTermination
2import Deployer
3import DistWorkerModels
4import EmceeExtensions
5import Foundation
6import MetricsExtensions
7import QueueModels
8
9public struct QueueServerConfiguration: Codable {
10
11/// Global analytics. https://github.com/avito-tech/Emcee/releases/tag/12.0.0
12public let globalAnalyticsConfiguration: AnalyticsConfiguration
13
14/// How often workers should poll a queue for new buckets, in seconds. Recommended and default value is `30` seconds.
15public let checkAgainTimeInterval: TimeInterval
16
17/// Where queue should be deployed.
18public let queueServerDeploymentDestinations: [DeploymentDestination]
19
20/// How queue should terminate.
21public let queueServerTerminationPolicy: AutomaticTerminationPolicy
22
23/// Where workers expected to be started.
24public let workerDeploymentDestinations: [DeploymentDestination]
25
26/// Default worker configuration, in case if you don't specify ones in `workerDeploymentDestinations`.
27public let defaultWorkerConfiguration: WorkerSpecificConfiguration?
28
29/// How workers are started.
30public let workerStartMode: WorkerStartMode
31
32/// Force communication only over IPv4. Sometimes IPv6 is enabled but not configured properly. In most cases pass `true` for ease of use.
33public let useOnlyIPv4: Bool
34
35/// What ports Emcee queue and workers should use. Default is `41000 ... 41010`.
36public let portRange: PortRange
37
38public init(
39globalAnalyticsConfiguration: AnalyticsConfiguration,
40checkAgainTimeInterval: TimeInterval,
41queueServerDeploymentDestinations: [DeploymentDestination],
42queueServerTerminationPolicy: AutomaticTerminationPolicy,
43workerDeploymentDestinations: [DeploymentDestination],
44defaultWorkerSpecificConfiguration: WorkerSpecificConfiguration?,
45workerStartMode: WorkerStartMode,
46useOnlyIPv4: Bool,
47portRange: PortRange
48) {
49self.globalAnalyticsConfiguration = globalAnalyticsConfiguration
50self.checkAgainTimeInterval = checkAgainTimeInterval
51self.queueServerDeploymentDestinations = queueServerDeploymentDestinations
52self.queueServerTerminationPolicy = queueServerTerminationPolicy
53self.workerDeploymentDestinations = workerDeploymentDestinations
54self.defaultWorkerConfiguration = defaultWorkerSpecificConfiguration
55self.workerStartMode = workerStartMode
56self.useOnlyIPv4 = useOnlyIPv4
57self.portRange = portRange
58}
59
60private enum CodingKeys: String, CodingKey {
61case globalAnalyticsConfiguration
62case checkAgainTimeInterval
63case queueServerDeploymentDestinations
64case queueServerTerminationPolicy
65case workerDeploymentDestinations
66case defaultWorkerConfiguration
67case workerStartMode
68case useOnlyIPv4
69case portRange
70}
71
72public init(from decoder: Decoder) throws {
73let container = try decoder.container(keyedBy: CodingKeys.self)
74
75let globalAnalyticsConfiguration = try container.decodeIfPresentExplaining(AnalyticsConfiguration.self, forKey: .globalAnalyticsConfiguration) ?? QueueServerConfigurationDefaultValues.globalAnalyticsConfiguration
76let checkAgainTimeInterval = try container.decodeIfPresentExplaining(TimeInterval.self, forKey: .checkAgainTimeInterval) ?? QueueServerConfigurationDefaultValues.checkAgainTimeInterval
77let queueServerDeploymentDestinations = try container.decodeExplaining([DeploymentDestination].self, forKey: .queueServerDeploymentDestinations)
78let queueServerTerminationPolicy = try container.decodeIfPresentExplaining(AutomaticTerminationPolicy.self, forKey: .queueServerTerminationPolicy) ?? QueueServerConfigurationDefaultValues.queueServerTerminationPolicy
79let workerDeploymentDestinations = try container.decodeExplaining([DeploymentDestination].self, forKey: .workerDeploymentDestinations)
80let defaultWorkerSpecificConfiguration = try container.decodeIfPresentExplaining(WorkerSpecificConfiguration.self, forKey: .defaultWorkerConfiguration) ?? WorkerSpecificConfigurationDefaultValues.defaultWorkerConfiguration
81let workerStartMode = try container.decodeIfPresentExplaining(WorkerStartMode.self, forKey: .workerStartMode) ?? QueueServerConfigurationDefaultValues.workerStartMode
82let useOnlyIPv4 = try container.decodeIfPresentExplaining(Bool.self, forKey: .useOnlyIPv4) ?? QueueServerConfigurationDefaultValues.useOnlyIPv4
83let portRange = try container.decodeIfPresentExplaining(PortRange.self, forKey: .portRange) ?? QueueServerConfigurationDefaultValues.defaultQueuePortRange
84
85self.init(
86globalAnalyticsConfiguration: globalAnalyticsConfiguration,
87checkAgainTimeInterval: checkAgainTimeInterval,
88queueServerDeploymentDestinations: queueServerDeploymentDestinations,
89queueServerTerminationPolicy: queueServerTerminationPolicy,
90workerDeploymentDestinations: workerDeploymentDestinations,
91defaultWorkerSpecificConfiguration: defaultWorkerSpecificConfiguration,
92workerStartMode: workerStartMode,
93useOnlyIPv4: useOnlyIPv4,
94portRange: portRange
95)
96}
97
98public func encode(to encoder: Encoder) throws {
99var container = encoder.container(keyedBy: CodingKeys.self)
100
101try container.encodeIfPresent(globalAnalyticsConfiguration, forKey: .globalAnalyticsConfiguration)
102try container.encode(checkAgainTimeInterval, forKey: .checkAgainTimeInterval)
103try container.encode(queueServerDeploymentDestinations, forKey: .queueServerDeploymentDestinations)
104try container.encode(queueServerTerminationPolicy, forKey: .queueServerTerminationPolicy)
105try container.encode(workerDeploymentDestinations, forKey: .workerDeploymentDestinations)
106try container.encodeIfPresent(defaultWorkerConfiguration, forKey: .defaultWorkerConfiguration)
107try container.encode(workerStartMode, forKey: .workerStartMode)
108try container.encode(useOnlyIPv4, forKey: .useOnlyIPv4)
109try container.encode(portRange, forKey: .portRange)
110}
111
112public func workerConfiguration(
113workerSpecificConfiguration: WorkerSpecificConfiguration,
114payloadSignature: PayloadSignature
115) -> WorkerConfiguration {
116return WorkerConfiguration(
117globalAnalyticsConfiguration: globalAnalyticsConfiguration,
118numberOfSimulators: workerSpecificConfiguration.numberOfSimulators,
119payloadSignature: payloadSignature,
120maximumCacheSize: workerSpecificConfiguration.maximumCacheSize,
121maximumCacheTTL: workerSpecificConfiguration.maximumCacheTTL,
122portRange: portRange
123)
124}
125}
126