Firebase Xamarin.Forms - слишком много одновременных подключений - PullRequest
0 голосов
/ 01 мая 2020

В настоящее время я разрабатываю приложение с небольшой командой, используя Xamarin.Forms. Нам нужно связаться с базой данных, чтобы получить некоторые местоположения, детали заказа и так далее. Мы используем Google Firebase (Realtime DB) для этой цели. Все работает нормально, когда мы пишем и читаем данные. Однако в консоли Firebase на вкладке «Использование» имеется более 50 одновременных подключений . Это странно, так как мы сейчас разрабатываем и не выпустили ни одной версии нашего приложения. Должно быть не более 5 одновременных подключений (мы - команда из 5 человек).

Мы используем NuGet-Package FirebaseDatabase. net (4.0.4) https://www.nuget.org/packages/FirebaseDatabase.net/ для чтение и запись в базу данных.

Несколько слушателей используются, чтобы иметь возможность реагировать на изменения в базе данных (до сих пор кажется, что каждый слушатель использует одно соединение, которое кажется неправильным).

Приведенный ниже код показывает инициализацию FirebaseClient, который вызывается один раз в конструкторе.

private FirebaseClient InitDbClient()
{
    var dbClient = new FirebaseClient(Constants.Values.FIREBASE_DATABASE_URL, new FirebaseOptions()
    {
        AuthTokenAsyncFactory = () => Task.FromResult(_authToken)
    });
    return dbClient;
}

Каждый слушатель реализован аналогично следующему коду:

public IDisposable SubscribeToChatMessages(string orderID)
{
    var observer = _dbClient.Child($"orders/{orderID}/Chat/Messages").AsObservable<JObject>();

    var subscribe = observer.Subscribe(t =>
    {
        if (t.EventType == Firebase.Database.Streaming.FirebaseEventType.Delete)
        {
            return;
        }

        ChatMessage msg;
        try
        {
            msg = JsonConvert.DeserializeObject<ChatMessage>(t.Object.ToString());
        }catch(Exception e)
        {
            Debug.WriteLine(e.Message);
            msg = new ChatMessage() { C = null, T = new DateTime(), U = null };
        }

        //...do something with the chat message
    });
    return subscribe;
}

Поскольку я не уверен, в чем проблема, я просто поместил здесь немного нашего кода. Было бы замечательно, если бы у кого-нибудь было решение этой проблемы или есть идеи, что мы можем попробовать.

1 Ответ

0 голосов
/ 04 мая 2020

Я нашел ответ сам. Как я уже подозревал, каждый слушатель использует одно соединение. Причина этого проста: пакет построен поверх остальных API Firebase. В каком-то другом вопросе было упомянуто, что каждый слушатель - это потоковый веб-сокет (или что-то в этом роде). Каждый из них использует одно из одновременных подключений.

В качестве обходного пути (для уменьшения количества одновременных подключений) я заменил всех прослушивателей, которые на самом деле не нужны, комбинацией таймера и простого запроса БД. Чтобы иметь возможность запрашивать новые данные, я добавил метки времени к самим данным. Это позволяет мне использовать DB-запрос, похожий на

dbClient.Child($"orders/{orderID}/Chat/Messages").orderBy("Time").startAt(lastRead).OnceAsync<>()...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...