Использование Redis как ссылка между Docker-контейнерами - PullRequest
0 голосов
/ 15 января 2019

У меня есть файл docker-compose с несколькими контейнерами, два из которых должны обмениваться данными через Redis DB. Оба контейнера имеют связи с Рейдами, и я могу читать / писать из обоих. Однако я бы хотел, чтобы контейнер запускался каждый раз, когда что-то добавлялось из другого контейнера. Я думал, что смогу сделать это через Redis Sub / Pub, но когда я запускаю код, он никогда ничего не вызывает, даже когда я вижу, что добавил новые элементы в очередь Redis.

Отсюда у меня два вопроса: 1. Возможно ли то, что я хочу сделать? Могу ли я сделать публикацию / подписку в двух отдельных контейнерах док-станции и ожидать, что она будет работать, как описано выше? 2. Если это возможно, кто-нибудь может указать мне, где я ошибаюсь с этими инструментами?

Это моя функция: я добавляю новые данные в очередь Redis, а затем публикую их в Docker-контейнере 1.

func redisShare(key string, value string) {
jobsQueue.Set(key, value, 0) //setting in the queue
jobsQueue.Publish(key, value) //publishing for the other docker container to notice
fmt.Println("added ", key, "with a value of ", value, "to the redis queue")
}

Я использую эту строку в моем другом контейнере Docker, чтобы подписаться на очередь Redis и прослушать изменения: redisdb.Subscribe()

Я ожидаю, что если что-то будет добавлено в очередь redis, то оно поделится данными с другим контейнером, и я увижу полученное сообщение, но сейчас Docker Container 2 просто запускается, а затем закрывается.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 января 2019

На всякий случай, если кто-то еще задается вопросом об ответе: я использовал комбинацию ответов Александра и Суй.В моем первом контейнере Docker я опубликовал результаты для определенного канала:

publishData := redisdb.Subscribe("CHANNELNAME")

А затем во втором контейнере Docker, который подписывался на канал, благодаря sui за помощь в этой части я подписался наканал и вытащил как UID, так и информацию об IP-адресе следующим образом:

ch := pubsub.Channel()
    for msg := range ch {
        fmt.Println(msg.Payload)
        s := strings.Split(msg.Payload, ":")
        UID, IP := s[0], s[1]
        fmt.Println(UID, IP)
    }

Пока это прекрасно работает для меня - большое спасибо sui и Aleksandrs за помощь!

0 голосов
/ 15 января 2019

Начиная с документов

receiver.go

package main

import (
    "fmt"

    "github.com/go-redis/redis"
)

func main() {
    c := redis.NewClient(&redis.Options{
        Addr: ":6379",
    })

    pubsub := c.Subscribe("mychannel1")

    // Wait for confirmation that subscription is created before publishing anything.
    _, err := pubsub.Receive()
    if err != nil {
        panic(err)
    }

    // Go channel which receives messages.
    ch := pubsub.Channel()

    // Consume messages.
    for msg := range ch {
        fmt.Println(msg.Channel, msg.Payload)
    }
}

sender.go

package main

import (
    "time"

    "github.com/go-redis/redis"
)

func main() {
    c := redis.NewClient(&redis.Options{
        Addr: ":6379",
    })

    // Publish a message.
    for range time.Tick(time.Second) {
        err := c.Publish("mychannel1", "hello").Err()
        if err != nil {
            panic(err)
        }
    }
}
...