Послать сообщение определенной программе на основе ключа - PullRequest
4 голосов
/ 27 марта 2019

Я хотел бы реализовать следующее:

  • Запуск нескольких рабочих подпрограмм, каждая из которых выполняет определенную бизнес-логику.
  • Различные обработчики Http распределяют работу среди этих рабочих.
  • Ввод (по каналу) в каждую программу будет иметь некоторые данные (состояние), в которых будет один ключ.
  • Возможно также несколько данных с одним и тем же ключом.

Наше требование заключается в том, что обработка конкретного ключа должна быть сериализована.например, программа 1 обрабатывает данные, относящиеся к Key:1234, тогда другие программы не должны обрабатывать другие данные для того же ключа, прежде чем программа 1. выполнит свою работу.

Кто-нибудь может предложить лучший подход для этого?

1 Ответ

0 голосов
/ 05 апреля 2019

Я использую карту [Key] chan State Map для хранения сопоставления для Key to Channel. Создание процедуры Go для каждого Key.

var keymap sync.Map
func handle_webservice(req WebReq) {
    val, ok := keymap.Load(req.Key)
    if ok {
        val1, _ := val.(chan Event)
        val1 <- Event{Data: req}
    } else {
        ch := make(chan Event, 5)
        go Worker(ch)
        keymap.Store(req.Key, ch)
        ch <- Event{Source: WEBSERVICE, Data: req}
    }

func sendToWorker(event Event) {
    val, ok := keymap.Load(event.Key)
    if ok {
        val1, _ := val.(chan Event)
        select {
        case val1 <- event:
        default:

        }
    } 
}
...