El objetivo de este marco es ser un marco general, espero que sea amplio y completo, y que pueda usarse directamente como plantilla básica para otros proyectos en el futuro. En este artículo, agregaré una función de cola.
nsq
Hay muchos tipos de colas, elijo nsq. Use nsq necesita conocer los siguientes conceptos:
- nsqd: el componente responsable de mantener la cola, aceptar la cola y entrega de mensajes;
- nsqlookupd: gestiona los componentes del clúster nsq;
- nsqadmin: componente de gestión web de nsq;
- tema: una colección de mensajes. Para generar un mensaje, debe especificar a qué tema pertenece el mensaje;
- canal: una copia del mensaje de la cola. El consumidor nsq establece un canal con nsqd o nsqlookupd, y escucha los mensajes en el canal para lograr el consumo.
Después de comprender algunos conceptos básicos de nsq, primero configuramos el entorno nsq. Aquí todavía usamos docker-compose.
version: '3'
services:
nsqlookupd:
image: nsqio/nsq
command: /nsqlookupd
networks:
- nsq-network
hostname: nsqlookupd
ports:
- "4161:4161"
- "4160:4160"
nsqd:
image: nsqio/nsq
command: /nsqd --lookupd-tcp-address=nsqlookupd:4160 --broadcast-address=nsqd
depends_on:
- nsqlookupd
hostname: nsqd
networks:
- nsq-network
ports:
- "4151:4151"
- "4150:4150"
nsqadmin:
image: nsqio/nsq
command: /nsqadmin --lookupd-http-address=nsqlookupd:4161
depends_on:
- nsqlookupd
hostname: nsqadmin
ports:
- "4171:4171"
networks:
- nsq-network
networks:
nsq-network:
driver: bridge
Después de iniciar el servicio nsq, simplemente verificamos y publicamos un mensaje en nsq:
curl -d 'hello awesome' 'http://127.0.0.1:4151/pub?topic=awesome'
Visita del navegador: http: // localhost: 4171 / , también podemos ver el tema correspondiente y la generación.
Luego modificamos el código, las viejas reglas, primero cambiamos la configuración:
"nsq_config":
"topic": "awesome"
"channel": "ch"
"nsqlookupd_addr": "127.0.0.1:4161"
type NsqConfig struct {
Topic string `yaml:"topic"`
Channel string `yaml:"channel"`
NsqLookupdAddr string `yaml:"nsqlookupd_addr"`
}
Luego agregue una función para iniciar el consumidor mq en mq.go:
func StartMqServer() {
conf := nsq.NewConfig()
q, _ := nsq.NewConsumer(config.GetConfig().NsqConfig.Topic, config.GetConfig().NsqConfig.Channel, conf)
q.AddHandler(nsq.HandlerFunc(func(message *nsq.Message) error {
//do something when you receive a message
logger.GetLogger().Info("receive", zap.String(config.GetConfig().NsqConfig.Topic, string(message.Body)))
return nil
}))
err := q.ConnectToNSQLookupd(config.GetConfig().NsqConfig.NsqLookupdAddr)
if err != nil {
logger.GetLogger().Error("connect to nsqlookupd failed.", zap.Error(err))
os.Exit(-1)
}
}
También en el archivo de entrada, inícielo:
go mq.StartMqServer()
Finalmente, escribimos un productor, generamos un mensaje y probamos:
func TestProducer(t *testing.T) {
config := nsq.NewConfig()
p, err := nsq.NewProducer("127.0.0.1:4150", config)
if err != nil {
log.Panic(err)
}
err = p.Publish("awesome", []byte("hello awesome"))
if err != nil {
log.Panic(err)
}
}
Para ver el código completo, consulte: https://github.com/TomatoMr/awesomeframework .
Bienvenido a prestar atención a mi número público: onepunchgo, déjame un mensaje.