PubNub 中的聊天消息排序策略
Chat messages ordering strategy in PubNub
我们正在 Android 中构建一个聊天应用程序,并且很难决定消息的消息排序策略。到目前为止,我们一直在为发送的消息使用设备时间,为接收的消息使用服务器时间。我们意识到如果设备时间与服务器时间不同步,这种策略很容易失败。
作为替代方案,我们计划对发送和接收的消息使用设备时间来保持正确的顺序。为了解决设备时间可能设置不正确的情况,我们计划在发布回调中收到的 PubNub timetoken 与用户的设备时间相差很远时向用户显示祝酒词。下面的代码片段:
这是一种可接受的消息排序策略吗?有没有更好的选择。
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();
}
如何在多个时区的多个设备上订购聊天消息?
PubNub 提供了一个 time
API,可用于在一毫秒内同步客户端(每个客户端都有自己的延迟)。这可以通过创建一个最小缓冲时间(等待时间)来完成,所有设备在确认信号后同意继续前进。您可以使用此时间同步 API 为每条消息创建一个 订单 ID 。首先你需要存储客户端增量漂移并计算当前时间。
按照以下基本步骤同步具有独立延迟的设备:
- 确定当地时间(以毫秒为单位):
start = now()
- 加载服务器时间令牌:
timetoken = http://pubsub.pubnub.com/time/0
- 计算时间令牌请求的延迟:
delay = now() - start
- 将服务器时间令牌转换为毫秒:
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!" } });
我们正在 Android 中构建一个聊天应用程序,并且很难决定消息的消息排序策略。到目前为止,我们一直在为发送的消息使用设备时间,为接收的消息使用服务器时间。我们意识到如果设备时间与服务器时间不同步,这种策略很容易失败。
作为替代方案,我们计划对发送和接收的消息使用设备时间来保持正确的顺序。为了解决设备时间可能设置不正确的情况,我们计划在发布回调中收到的 PubNub timetoken 与用户的设备时间相差很远时向用户显示祝酒词。下面的代码片段:
这是一种可接受的消息排序策略吗?有没有更好的选择。
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();
}
如何在多个时区的多个设备上订购聊天消息?
PubNub 提供了一个 time
API,可用于在一毫秒内同步客户端(每个客户端都有自己的延迟)。这可以通过创建一个最小缓冲时间(等待时间)来完成,所有设备在确认信号后同意继续前进。您可以使用此时间同步 API 为每条消息创建一个 订单 ID 。首先你需要存储客户端增量漂移并计算当前时间。
按照以下基本步骤同步具有独立延迟的设备:
- 确定当地时间(以毫秒为单位):
start = now()
- 加载服务器时间令牌:
timetoken = http://pubsub.pubnub.com/time/0
- 计算时间令牌请求的延迟:
delay = now() - start
- 将服务器时间令牌转换为毫秒:
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!" } });