Redis отправляет объект с сообщением для использования при вызове метода

#object #redis #stackexchange.redis

#объект #redis #stackexchange.redis

Вопрос:

Здравствуйте, я получил redis в качестве объединительной платы для моего приложения SignalR, и я хочу, чтобы redis отправлял сообщение определенным группам, независимо от того, в каком экземпляре SignalR они находятся. Я получил настройку SignalR и redis проблема, с которой я сейчас сталкиваюсь, заключается в том, что я хочу отправить данные объектного типа, которые будут использоваться методом SignalR, который отправляет их клиенту. итак, сначала рассмотрим метод, который публикует

 public async Task RedisBroadcast(string group, string message, object data)
    {
        var pub = Connection.GetSubscriber();
        Program.WriteConsole($"> Broadcasting to Group: {group} Message: {message}");
        await pub.PublishAsync(group, message);
    }
  

мне нужно, чтобы данные параметра были отправлены с сообщением публикации, потому что позже были в методе, который получает сообщение, я хочу сделать что-то похожее на это

 await sub.SubscribeAsync(group, (channel, message) =>
        {
            Program.WriteConsole("Got notification: "   (string)message);

            switch (message)
            {
                case "TopPlayers":
                    TopPlayersbroadcast(group, message, data);
                    break;
            }
        });
  

поэтому в зависимости от сообщения я вызываю разные методы, которые затем передают сообщение с данными всем дочерним клиентам. Возможно ли это каким-либо образом?

Ответ №1:

Это возможно, но вам нужно будет закодировать эти данные внутри вашей полезной нагрузки, то есть внутри message тех RedisValue данных, которые вы получаете в (channel, message) паре. Библиотека SE.Redis намеренно не придерживается мнения о том, как должны выглядеть полезные нагрузки, поэтому она не предполагает, что вы хотите закодировать что-то подобное. Обратите внимание, что, поскольку это RedisValue , а не a string , вы можете выполнять некоторые более тонкие действия, чем просто передавать свой оригинал string message .

Если бы это был я, я бы, вероятно, рассмотрел что-то вроде protobuf-net и наследования объектов в этом сценарии — поскольку a: это хорошо работает с SE.Redis, поскольку SE.Redis поддерживает двоичные полезные нагрузки, и b: наследование позволяет вам довольно легко представлять данные — предположительно, внедряя message и data в то же основное сообщение, что и базовый тип, но для похожих схем существует множество разных макетов.