options.go

package nsqd

import (
    "crypto/md5"
    "crypto/tls"
    "hash/crc32"
    "io"
    "log"
    "os"
    "time"
)

type Options struct {
    // basic options
    ID                       int64         `flag:"worker-id" cfg:"id"`
    Verbose                  bool          `flag:"verbose"`
    TCPAddress               string        `flag:"tcp-address"`
    HTTPAddress              string        `flag:"http-address"`
    HTTPSAddress             string        `flag:"https-address"`
    BroadcastAddress         string        `flag:"broadcast-address"`
    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
    QueueScanWorkerPoolMax   int
    QueueScanDirtyPercent    float64

    // msg and command options
    MsgTimeout    time.Duration `flag:"msg-timeout" arg:"1ms"`
    MaxMsgTimeout time.Duration `flag:"max-msg-timeout"`
    MaxMsgSize    int64         `flag:"max-msg-size" deprecated:"max-message-size" cfg:"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"`

    // statsd integration
    StatsdAddress  string        `flag:"statsd-address"`
    StatsdPrefix   string        `flag:"statsd-prefix"`
    StatsdInterval time.Duration `flag:"statsd-interval" arg:"1s"`
    StatsdMemStats bool          `flag:"statsd-mem-stats"`

    // 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"`

    Logger Logger
}

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,

        TCPAddress:       "0.0.0.0:4150",
        HTTPAddress:      "0.0.0.0:4151",
        HTTPSAddress:     "0.0.0.0:4152",
        BroadcastAddress: hostname,

        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: 1 * time.Second,

        StatsdPrefix:   "nsq.%s",
        StatsdInterval: 60 * time.Second,
        StatsdMemStats: true,

        E2EProcessingLatencyWindowTime: time.Duration(10 * time.Minute),

        DeflateEnabled:  true,
        MaxDeflateLevel: 6,
        SnappyEnabled:   true,

        TLSMinVersion: tls.VersionTLS10,

        Logger: log.New(os.Stderr, "[nsqd] ", log.Ldate|log.Ltime|log.Lmicroseconds),
    }
}