Documentation ¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
var (
EventHandlers = make([]func(*Server) error, 0)
)
Functions ¶
Types ¶
type ClientData ¶
type ClientData struct { Hostname string `json:"hostname"` Wid string `json:"wid"` Pid int `json:"pid"` Labels []string `json:"labels"` PasswordHash string `json:"pwdhash"` Version uint8 `json:"v"` StartedAt time.Time // contains filtered or unexported fields }
This represents a single client process. It may have many network connections open to Faktory.
A client can be a producer AND/OR consumer of jobs. Typically a process will either only produce jobs (like a webapp pushing jobs) or produce/consume jobs (like a faktory worker process where a job can create other jobs while executing).
Each Faktory worker process should send a BEAT command every 15 seconds. Only consumers should send a BEAT. If Faktory does not receive a BEAT from a worker process within 60 seconds, it expires and is removed from the Busy page.
From Faktory's POV, the worker can BEAT again and resume normal operations, e.g. due to a network partition. If a process dies, it will be removed after 1 minute and its jobs recovered after the job reservation timeout has passed (typically 30 minutes).
A worker process has a simple three-state lifecycle:
running -> quiet -> terminate
- Running means the worker is alive and processing jobs. - Quiet means the worker should stop FETCHing new jobs but continue working on existing jobs. It should not exit, even if no jobs are processing. - Terminate means the worker should exit within N seconds, where N is recommended to be 30 seconds. In practice, faktory_worker_ruby waits up to 25 seconds and any threads that are still busy are forcefully killed and their associated jobs reported as FAILed so they will be retried shortly.
A worker process should never stop sending BEAT. Even after "quiet" or "terminate", the BEAT should continue, only stopping due to process exit(). Workers should never move backward in state - you cannot "unquiet" a worker, it must be restarted.
Workers will typically also respond to standard Unix signals. faktory_worker_ruby uses TSTP ("Threads SToP") as the quiet signal and TERM as the terminate signal.
func (*ClientData) IsConsumer ¶
func (worker *ClientData) IsConsumer() bool
func (*ClientData) IsQuiet ¶
func (worker *ClientData) IsQuiet() bool
func (*ClientData) Signal ¶
func (worker *ClientData) Signal(newstate WorkerState)
* Send "quiet" or "terminate" to the given client * worker process. Other signals are undefined.
type Connection ¶
type Connection struct {
// contains filtered or unexported fields
}
Represents a connection to a faktory client.
faktory reuses the same wire protocol as Redis: RESP. It's a nice trade-off between human-readable and efficient. Shout out to antirez for his nice design document on it. https://redis.io/topics/protocol
func (*Connection) Close ¶
func (c *Connection) Close()
func (*Connection) Number ¶
func (c *Connection) Number(val int) error
func (*Connection) Ok ¶
func (c *Connection) Ok() error
func (*Connection) Result ¶
func (c *Connection) Result(msg []byte) error
type RuntimeStats ¶
type Server ¶
type Server struct { Options *ServerOptions Stats *RuntimeStats Password string // contains filtered or unexported fields }
func NewServer ¶
func NewServer(opts *ServerOptions) (*Server, error)
func (*Server) CurrentState ¶
func (*Server) Heartbeats ¶
func (s *Server) Heartbeats() map[string]*ClientData