package nsqd import ( "crypto/md5" "crypto/tls" "hash/crc32" "io" "log" "os" "time" "github.com/nsqio/nsq/internal/lg" ) type Options struct { // basic options ID int64 `flag:"node-id" cfg:"id"` LogLevel lg.LogLevel `flag:"log-level"` LogPrefix string `flag:"log-prefix"` Logger Logger TCPAddress string `flag:"tcp-address"` HTTPAddress string `flag:"http-address"` HTTPSAddress string `flag:"https-address"` BroadcastAddress string `flag:"broadcast-address"` BroadcastTCPPort int `flag:"broadcast-tcp-port"` BroadcastHTTPPort int `flag:"broadcast-http-port"` NSQLookupdTCPAddresses []string `flag:"lookupd-tcp-address" cfg:"nsqlookupd_tcp_addresses"` AuthHTTPAddresses []string `flag:"auth-http-address" cfg:"auth_http_addresses"` HTTPClientConnectTimeout time.Duration `flag:"http-client-connect-timeout" cfg:"http_client_connect_timeout"` HTTPClientRequestTimeout time.Duration `flag:"http-client-request-timeout" cfg:"http_client_request_timeout"` // diskqueue options DataPath string `flag:"data-path"` MemQueueSize int64 `flag:"mem-queue-size"` MaxBytesPerFile int64 `flag:"max-bytes-per-file"` SyncEvery int64 `flag:"sync-every"` SyncTimeout time.Duration `flag:"sync-timeout"` QueueScanInterval time.Duration QueueScanRefreshInterval time.Duration QueueScanSelectionCount int `flag:"queue-scan-selection-count"` QueueScanWorkerPoolMax int `flag:"queue-scan-worker-pool-max"` QueueScanDirtyPercent float64 // msg and command options MsgTimeout time.Duration `flag:"msg-timeout"` MaxMsgTimeout time.Duration `flag:"max-msg-timeout"` MaxMsgSize int64 `flag:"max-msg-size"` MaxBodySize int64 `flag:"max-body-size"` MaxReqTimeout time.Duration `flag:"max-req-timeout"` ClientTimeout time.Duration // client overridable configuration options MaxHeartbeatInterval time.Duration `flag:"max-heartbeat-interval"` MaxRdyCount int64 `flag:"max-rdy-count"` MaxOutputBufferSize int64 `flag:"max-output-buffer-size"` MaxOutputBufferTimeout time.Duration `flag:"max-output-buffer-timeout"` MinOutputBufferTimeout time.Duration `flag:"min-output-buffer-timeout"` OutputBufferTimeout time.Duration `flag:"output-buffer-timeout"` MaxChannelConsumers int `flag:"max-channel-consumers"` // statsd integration StatsdAddress string `flag:"statsd-address"` StatsdPrefix string `flag:"statsd-prefix"` StatsdInterval time.Duration `flag:"statsd-interval"` StatsdMemStats bool `flag:"statsd-mem-stats"` StatsdUDPPacketSize int `flag:"statsd-udp-packet-size"` StatsdExcludeEphemeral bool `flag:"statsd-exclude-ephemeral"` // e2e message latency E2EProcessingLatencyWindowTime time.Duration `flag:"e2e-processing-latency-window-time"` E2EProcessingLatencyPercentiles []float64 `flag:"e2e-processing-latency-percentile" cfg:"e2e_processing_latency_percentiles"` // TLS config TLSCert string `flag:"tls-cert"` TLSKey string `flag:"tls-key"` TLSClientAuthPolicy string `flag:"tls-client-auth-policy"` TLSRootCAFile string `flag:"tls-root-ca-file"` TLSRequired int `flag:"tls-required"` TLSMinVersion uint16 `flag:"tls-min-version"` // compression DeflateEnabled bool `flag:"deflate"` MaxDeflateLevel int `flag:"max-deflate-level"` SnappyEnabled bool `flag:"snappy"` QosEnabled bool `flag:"qos"` RtEnabled bool `flag:"rt"` FifoEnabled bool `flag:"fifo"` } func NewOptions() *Options { hostname, err := os.Hostname() if err != nil { log.Fatal(err) } h := md5.New() io.WriteString(h, hostname) defaultID := int64(crc32.ChecksumIEEE(h.Sum(nil)) % 1024) return &Options{ ID: defaultID, LogPrefix: "[smqd] ", LogLevel: lg.INFO, TCPAddress: "0.0.0.0:9050", HTTPAddress: "0.0.0.0:9051", HTTPSAddress: "0.0.0.0:9052", BroadcastAddress: hostname, BroadcastTCPPort: 0, BroadcastHTTPPort: 0, NSQLookupdTCPAddresses: make([]string, 0), AuthHTTPAddresses: make([]string, 0), HTTPClientConnectTimeout: 2 * time.Second, HTTPClientRequestTimeout: 5 * time.Second, MemQueueSize: 10000, MaxBytesPerFile: 100 * 1024 * 1024, SyncEvery: 2500, SyncTimeout: 2 * time.Second, QueueScanInterval: 100 * time.Millisecond, QueueScanRefreshInterval: 5 * time.Second, QueueScanSelectionCount: 20, QueueScanWorkerPoolMax: 4, QueueScanDirtyPercent: 0.25, MsgTimeout: 60 * time.Second, MaxMsgTimeout: 15 * time.Minute, MaxMsgSize: 1024 * 1024, MaxBodySize: 5 * 1024 * 1024, MaxReqTimeout: 1 * time.Hour, ClientTimeout: 60 * time.Second, MaxHeartbeatInterval: 60 * time.Second, MaxRdyCount: 2500, MaxOutputBufferSize: 64 * 1024, MaxOutputBufferTimeout: 30 * time.Second, MinOutputBufferTimeout: 25 * time.Millisecond, OutputBufferTimeout: 250 * time.Millisecond, MaxChannelConsumers: 0, StatsdPrefix: "nsq.%s", StatsdInterval: 60 * time.Second, StatsdMemStats: true, StatsdUDPPacketSize: 508, E2EProcessingLatencyWindowTime: time.Duration(10 * time.Minute), DeflateEnabled: true, MaxDeflateLevel: 6, SnappyEnabled: true, QosEnabled: false, RtEnabled: true, FifoEnabled: false, TLSMinVersion: tls.VersionTLS10, } }