如何将多个客户端的应用与稳定的Web服务同步?

时间:2019-04-25 12:16:51

标签: java android mysql json web-services

我正在从事一个涉及约5个Android客户的项目,这些客户正在查看项目列表并拥有这些项目的所有权。一切都通过RESTful Java Web服务加载,数据存储在mysql服务器中。

项目列表已加载到应用中,其中包含ITEM-NAME和OWNER。 选择一个项目后,所有其他客户应更新以显示该项目现在归他们所有。

每次选择一个项目时,都会将请求发送到Web服务中的同步块,并且此客户端将在确认没有其他人在他之前取走了该项目之后,对该项目进行所有权。

我现在的问题是:什么是将新选择的项目更新给所有客户的最佳实践,以免每n秒不必要地重新加载整个列表?

我的想法是: 每次更新发生时,日期时间将存储在mysql中。 Android应用程序将每5秒左右检查一次此值。如果它与存储在局部变量上的变量相同,则什么也不会发生。如果不同,则重新加载整个列表并更新局部变量。

足够了吗?

我还要指出,列表不会太广泛,因此无需单独更新特定项目;重新加载整个列表不会太重。

很抱歉,如果此类问题不是堆栈溢出问题,而是在其他地方将其发布的问题,则为idk。如果不合适,请在这方面指导我。

谢谢。

1 个答案:

答案 0 :(得分:0)

通常,短轮询是一个坏主意。所有请求都会影响客户端和服务器的性能和带宽。根据您的用例,几乎没有任何请求将保持不变。

更好的方法是让服务器将更改通知给客户端。 这通常是使用Firebase Cloud Messaging完成的。使用FCM,只要发生更改,您的服务器就可以通知所有已知的客户端。

或者,客户端可以使用“长时间轮询”:客户端发送HTTP请求,但是服务器直到更改发生后才响应。

也可以选择WebSockets-但它可能不太适合您的REST体系结构。

短轮询

t01: Client: Hi Server, is there an update?
t02: Server: No
t03: Client: Hi Server, is there an update?
t04: Server: No
t05: Client: Hi Server, is there an update? 
t06: Server: Yes, here it is!
t07: Client: Hi Server, is there an update?
t08: Server: No
t09: Client: Hi Server, is there an update? 
t10: Server: Yes, here it is!

长轮询

t01: Client: Hi Server, is there an update?
t06: Server: Yes, here it is!
t07: Client: Hi Server, is there an update?
t10: Server: Yes, here it is!

Firebase云消息传递

t01: Client: Hi Server, I'm client123. Please keep me on track.
t06: Server: Hi client123. There was a change!
t10: Server: Hi client123. There was a change!

WebSockets

t01: Client: Hi Server, here I am. 
t06: Server: There was a change!
t10: Server: There was a change!