Nyx con Ejemplos

Queue Enqueue

nyx-queue es una cola de mensajes persistente en el puerto 6381. ENQUEUE agrega un mensaje y devuelve un ID único. QLEN devuelve la profundidad de la cola. Los mensajes sobreviven reinicios gracias al formato de persistencia .ndb.

Código

// nyx-queue — ENQUEUE messages to a persistent queue
// nyx-queue — encolar mensajes en una cola persistente

fn resp_cmd(parts: Array) -> String {
    var sb: StringBuilder = StringBuilder.new()
    sb.append("*" + int_to_string(parts.length()) + "\r\n")
    var i: int = 0
    while i < parts.length() {
        let p: String = parts[i]
        sb.append("$" + int_to_string(p.length()) + "\r\n" + p + "\r\n")
        i = i + 1
    }
    return sb.to_string()
}

fn main() -> int {
    // nyx-queue listens on port 6381 (RESP protocol like nyx-kv)
    let fd: int = tcp_connect("127.0.0.1", 6381)
    if fd < 0 {
        print("connection failed (is nyx-queue running?)")
        return 1
    }

    // Enqueue a message — returns a unique message ID
    tcp_write(fd, resp_cmd(["ENQUEUE", "emails", "{\"to\":\"user@example.com\",\"subject\":\"Hi\"}"]))
    let hdr: String = tcp_read_line(fd)
    let msg_id: String = tcp_read_line(fd)
    print("ENQUEUE -> msg_id: " + msg_id.trim())

    // Get queue length
    tcp_write(fd, resp_cmd(["QLEN", "emails"]))
    let qlen: String = tcp_read_line(fd)
    print("QLEN emails -> " + qlen.trim())

    // Enqueue multiple messages for batch processing
    var i: int = 0
    while i < 3 {
        let payload: String = "task_" + int_to_string(i)
        tcp_write(fd, resp_cmd(["ENQUEUE", "tasks", payload]))
        tcp_read_line(fd)  // header
        tcp_read_line(fd)  // msg_id
        i = i + 1
    }
    print("enqueued 3 tasks")

    tcp_close(fd)
    return 0
}

Salida

ENQUEUE -> msg_id: 1
QLEN emails -> :1
enqueued 3 tasks

Explicación

Las colas separan "aceptar el trabajo" de "hacer el trabajo realmente" — el handler web responde en microsegundos, mientras un pool de workers procesa el backlog a su propio ritmo. nyx-queue habla RESP sobre el puerto 6381, así que cualquier librería cliente de nyx-kv simplemente funciona; los comandos son la diferencia interesante. ENQUEUE agrega a una cola con nombre y devuelve un ID de mensaje monótono, útil para idempotencia y trazabilidad. QLEN es O(1) y perfecto para señales de autoescalado ("levantar un worker cuando la profundidad supere 1000"). La persistencia usa el mismo formato binario .ndb que nyx-kv, así que los mensajes sobreviven a un crash o reinicio — algo que colas en memoria como las listas de Redis no pueden garantizar sin AOF. Una sola cola puede manejar correos, notificaciones push y eventos de facturación, todo en paralelo.

← Anterior Siguiente →

Source: examples/by-example/90-queue-enqueue.nx