如果这是一个糟糕的问题,我会事先道歉。
我是后端开发的新手,我正在尝试使用java servlet使用GAE构建即时消息服务。
我认为发送消息的过程如下: 1.客户端将JSON文件发送到servlet。 2. Servlet解析JSON文件并将消息存档到数据库。
所以我的问题是:
如果下一个用户在servlet处于将上一条消息保存到数据库的过程中尝试发送另一条消息时会发生什么?
由于用户请求的到达与servlet周期不同步,新请求是否会丢失?
是否会有一些机制对请求进行排队,或者是我必须自己实施的内容?
我认为我对分布式系统中不同功能之间的异步请求如何工作感到困惑。
并且,如果有任何读数,您会建议后端设计模式?或者只是一般介绍?
非常感谢!
答案 0 :(得分:0)
您需要确切知道'线程'是什么?当另一个请求发送到Servlet时。像tomcat这样的容器将为此请求分配另一个线程。每个线程都独立于另一个线程。
答案 1 :(得分:0)
请阅读有关java web技术,Web容器和servlet的深入讨论主题的官方教程: http://docs.oracle.com/javaee/6/tutorial/doc/bnafd.html
但要回答你的问题:
答案 2 :(得分:0)
服务器请求将并行运行,您的代码可能会同时访问/编辑相同的数据。您应该使用Datastore transactions来防止数据损坏。
不,请求是独立的,并且它们并行运行。
您可以在您的代码中使用任务队列来按顺序运行更新,但我建议高度反对它:首先任务队列将使您的请求加倍,其次它会强制分发并行系统顺序运行,基本上否定了AppEngine的整个目的。
并行处理在服务器编程中至关重要 - 它们使服务器能够处理大量请求。您应该编写考虑到这一点的代码 - 在这些情况下使用数据存储区事务来防止可能的数据损坏。
答案 3 :(得分:0)
在servlet生命周期中,init()和destroy()方法只被调用一次 - 但是每次新请求到达时都会调用service()并且命中应用程序,并且将与之共享servlet的新实例请求通过不同的线程。因此,创建servlet的最基本规则之一是不在servlet类中创建全局变量。
您的变量可由任何其他类读取/写入。你没有控制权来确保他们都能用它做出明智的事情。其中一个可以覆盖它/错误地增加它等等
每个JVM是servlet的一个实例。因此,线程可能会尝试同时访问它。因为它是全局的,并且您没有提供任何同步/访问控制,所以它不是线程安全的。此外,如果您在某种具有不同JVM的集群中运行servlet,那么变量将不会在它们之间共享,并且您将拥有多个loginAttempt变量。