我正在开发一个类似社交的应用程序,目前使用AWS服务进行部署.特别是,DB使用MYSQL在RDS上运行.到目前为止,我们使用有限数量的用户(主要是朋友)测试应用程序,平均每秒写入10次写入IOPS.
真正的问题与db的非常高的写入延迟有关,它始终高于100ms.RDS实例是db.m3.xlarge,远远超出我们的需要.
我试图在一个单独的实例(DB和EC2的相同配置)中执行负载测试,但即使我发送了更多的请求,我也无法重现如此高的延迟.所以我认为这可能是由于表碎片,但我还没有运行表优化,因为在此过程中无法访问db.
你对这个问题有经验吗?
更多信息
最大的表(称为Message)有大约790k行.关于此表,以下查询
insert into Message (user_id, creationDate, talk_id, text, id)
values (2015, '2015-02-01 16:40:06.737', 18312, 'Some text ', 904870)
Run Code Online (Sandbox Code Playgroud)
花了11秒才被执行.
更糟糕的是,查询
insert into Comment (anonymous, user_id, creationDate, deleted, post_id, text, id)
values (1, 107347, '2015-02-01 16:40:01.849', 0, 124888, 'Comment text', 265742)
Run Code Online (Sandbox Code Playgroud)
花了14秒,但表评论约有160k.
这两个表是由以下生成的:
CREATE TABLE `comment` (
`id` bigint(20) NOT NULL,
`anonymous` bit(1) NOT NULL,
`creationDate` datetime NOT NULL,
`deleted` bit(1) NOT NULL,
`text` varchar(1000) COLLATE utf8mb4_unicode_ci NOT NULL,
`user_id` bigint(20) NOT …Run Code Online (Sandbox Code Playgroud) 我正在尝试开发具有延迟加载的数据表。通过使用UserService(即简单的DAO),可以从持久性上下文正确加载未过滤和已过滤的记录。我100%肯定该问题与所使用的DAO无关,因为它已经成功测试并部署在其他软件包中。
当我尝试插入过滤器时出现错误:已过滤项目的集合已正确加载到页面上,但看起来在过程结束时出现了问题,并引发了NPE。此后,该表不再响应任何命令。
谢谢你的帮助!
以下是配置,视图和所使用的控制器。
组态
查看(XHTML页面)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:p="http://primefaces.org/ui">
<ui:composition template="/template/template.xhtml">
<ui:define name="body">
<h:form id="UserListForm">
<p:panel header="#{bundle.ListUserTitle}">
<p:dataTable id="UserTable" value="#{userController.users}" var="user" lazy="true" rows="25"
paginator="true" rowKey="#{user.id}" selectionMode="single" selection="#{userController.selected}"
paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}" >
<p:column headerText="#{bundle.User_id}" filterBy="#{user.id}">
<h:outputText value="#{user.id}"/>
</p:column>
<p:column headerText="#{bundle.User_nickname}" filterBy="#{user.nickname}">
<h:outputText value="#{user.nickname}"/>
</p:column>
</p:dataTable>
</p:panel>
</h:form>
</ui:define>
</ui:composition>
</html>
Run Code Online (Sandbox Code Playgroud)
控制者
import java.io.Serializable;
import javax.annotation.PostConstruct;
import javax.inject.Named;
import …Run Code Online (Sandbox Code Playgroud) 我正在努力寻找mongo db问题的解决方案:
我需要在具有高写/读比率的集合上运行查询。该查询包括按从属于同一文档的其他字段派生的字段对文档进行排序。而且,这些字段之一是数组的大小,这使其变得更加困难。
一个简单的例子:
D1 - { _id: 1, field: 1, array_field: [a,b,c,d] } -> score = 1 + 4 = 5
D2 - { _id: 2, field: 2, array_field: [a,b] } -> score = 2 + 2 = 4
Run Code Online (Sandbox Code Playgroud)
预期结果:
D1 - { _id: 2, score: 4 }
D2 - { _id: 1, score: 5 }
Run Code Online (Sandbox Code Playgroud)
(结果集中不需要分数)
到目前为止,我尝试过的解决方案:
将分数添加为文档的字段,该字段会不断更新,其他字段也会更新。问题:
创建一个聚合管道,使开发变得容易,并解决了参数化问题。但是,性能下降确实很高,因为mongo不能依赖计算字段上的使用索引,从而导致内存问题(100MB查询错误)。一种可能的解决方案是启用该allowDiskUse标志。但是,查询将变得太慢。
更新:我想指出,查询将每秒运行约10次。因此,将分数预先计算并存储在其他文档中可能不是可行的解决方案。
实用:由于问题非常棘手。让我给您更多背景信息。我有一个帖子文档(例如facebook帖子),目前正在按创建日期和最近更新进行排序。我希望能够按“热门程度”对帖子进行排序,“热门程度”是由我所说的分数定义的。我认为一种有趣的分数计算方法如下:
score = a * likes - b * dislikes + c …Run Code Online (Sandbox Code Playgroud)