2

在我的 GAE 服务器中,数据存储区读取操作在 12 小时后达到 100%,我有大约 20 个用户。

与我的应用程序中的其他操作一起,我构建了一个聊天,其中连接到我的应用程序的用户每 1 秒汇集一次服务器。因此,我有很多请求,/message但我没有访问数据存储。

/message请求数量(约 42K)与最大数据存储读取操作(50k)之间是否存在相关性?

在此处输入图像描述

编辑:

代码/message

ArrayListMultimap<String, ChatMessage> messages;
ServletContext application = null;

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{

    if (application == null)
    {
        application = getServletContext();
        messages = ArrayListMultimap.create();          
    }       

    out = response.getOutputStream();
    oos = new ObjectOutputStream(out);  
    Object o = ServerUtils.readObject(request);

    if(o instanceof ChatMessage)
    {
        ChatMessage message = (ChatMessage) o; 
        messages.put(message.getReciverId(), message);          
        List<ChatMessage> list = (List<ChatMessage>) messages.get(message.getReciverId());              
    }

    else if(o instanceof String)
    {           
        String sender = (String) o;
        List<ChatMessage> list = (List<ChatMessage>) messages.removeAll(sender);
        ArrayList<ChatMessage> newList = new ArrayList<ChatMessage>(list);
        reponseToClient(newList);
    }


}
4

2 回答 2

2

一个好的起点是设置 Appstats。这将向您显示正在发生数据存储读取以及哪些读取需要很长时间。 https://developers.google.com/appengine/docs/java/tools/appstats

此外,考虑使用 channelApi 或 xmpp 来代替轮询,而不是轮询消息。https://developers.google.com/appengine/docs/java/xmpp/overview https://developers.google.com/appengine/docs/java/channel/

于 2012-08-17T09:02:19.863 回答
0

您的应用程序会话启用了吗?会话通过将其数据存储在数据存储中以实现持久性来工作,这可能是每次请求进入 /message 处理程序时读取的内容。

于 2012-08-17T09:01:34.607 回答