Стратегия заказа сообщений чата в PubNub

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

В качестве альтернативы мы планируем использовать время устройства как для отправленных, так и для полученных сообщений, чтобы сохранить правильный порядок. Чтобы учесть случаи, когда время устройства может быть установлено неправильно, мы планируем показывать всплывающее уведомление пользователю, если маркер времени PubNub, полученный в обратном вызове публикации, отличается от времени устройства пользователя. Фрагмент кода ниже:

Является ли это приемлемой стратегией для упорядочения сообщений? Есть ли лучшие альтернативы.

public void successCallback(String channel,
                                        Object message) {
                if (channel.equals(getUserChannel())) {

                    JSONArray messageDetails = (JSONArray) message;

                    if(messageDetails.length() >2)
                        try {
                            long timeToken = Long.parseLong(messageDetails.getString(2));

                            timeToken = timeToken / 10000;

                            changeMessageStatus(chatMessage.getMobileId(), Status.SENT);

                            long diffValue = timeToken - Calendar.getInstance().getTimeInMillis();

                            if(Math.abs(diffValue) > Constants.TIME_DIFF_THRESHOLD)
                            {
                                applicationHandler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        Toast.makeText(getApplicationContext(), getString(R.string.incorrect_time), Toast.LENGTH_SHORT).show();
                                    }
                                });

                            }

                            Log.d(Constants.TAG,"Diff Time: " + String.valueOf(diffValue));

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                }

                pubnub.unsubscribeAll();
            }

person Madhur Ahuja    schedule 11.02.2015    source источник
comment
Мадхур - дайте мне знать, если эта база знаний будет полезна. pubnub.com/knowledge- база/обсуждение/195/   -  person Craig Conover    schedule 12.02.2015
comment
Подождите, это о синхронизации времени и упорядочении сообщений чата. Вы можете использовать API синхронизации времени PubNub, чтобы получить общий метод синхронизации времени для устройств и использовать его в качестве временной шкалы для каждого устройства независимо от часового пояса. На самом деле это будет работать очень хорошо!   -  person Stephen Blum    schedule 12.02.2015
comment
Отличная идея Крейг!   -  person Stephen Blum    schedule 12.02.2015
comment
Спасибо Крейг .. очень полезно   -  person Madhur Ahuja    schedule 13.02.2015
comment
@MadhurAhuja У меня проблема с сообщением о заказе. Я опубликовал сообщение от python и подписался в браузере. Порядок сообщений в браузере неверный. Кажется, вы решили эту проблему. Не могли бы вы сказать мне, как заказать сообщения чата?   -  person ToujouAya    schedule 28.10.2019
comment
@ToujouAya См. ответ Стивена ниже. Вам придется упорядочивать его вручную, добавляя временные метки к каждому сообщению и объединяя их на стороне получателя.   -  person Madhur Ahuja    schedule 30.10.2019


Ответы (1)


Как заказать сообщения чата на нескольких устройствах в разных часовых поясах?

PubNub предоставляет time API, который можно использовать для синхронизации клиентов (у каждого из которых своя задержка) с разницей в миллисекунду. Это можно сделать, создав минимальное время буфера (время ожидания), в течение которого все устройства соглашаются двигаться вперед после подтверждения сигнала. Вы можете использовать этот API синхронизации времени для создания идентификатора заказа для каждого сообщения. Сначала нужно сохранить дрейф дельты клиента и рассчитать текущее время.

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

  1. Определяем местное время (в миллисекундах): start = now()
  2. Загрузить токен сервера: timetoken = http://pubsub.pubnub.com/time/0
  3. Вычислите задержку задержки для запроса timetoken: delay = now() - start
  4. Преобразование маркера времени сервера в миллисекунды: timetoken = timetoken/10000
  5. Добавьте задержку для компенсации задержки: message_order_id = timetoken + delay

Используйте message_order_id, чтобы синхронизировать все устройства для запуска в определенное время. message_order_id — это, по сути, ваш новый идентификатор заказа сообщения, который можно использовать для отображения сообщения на экране. Когда вы публикуете сообщение в чате, включите message_order_id в качестве записи в словарь.

message_order_id = timetoken + delay // new message order id
pubnub.publish({ message : { order_id : message_order_id, message : "Hi!" } });
person Stephen Blum    schedule 12.02.2015