Стратегия упорядочения сообщений чата в PubNub

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

В качестве альтернативы мы планируем использовать время устройства для отправленных и полученных сообщений для поддержания правильного порядка. Для учета случаев, когда время устройства может быть неправильно установлено, мы планируем показать тост пользователю, если PubNub timetoken, полученный в обратном вызове Publish, ушел с пользовательского времени. Ниже приведен фрагмент кода:

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

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();
 }
1 ответ

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

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

Следуйте этим основным шагам для синхронизации устройств с независимыми задержками:

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

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

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

licensed under cc by-sa 3.0 with attribution.