- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须修改 dropwizard 应用程序以提高其运行时间。基本上,该应用程序每天接收大约 300 万个 URL,并下载和解析它们以检测恶意内容。问题是该应用程序只能处理 100 万个 URL。当我查看该应用程序时,我发现它正在进行大量顺序调用。我想要一些关于如何通过异步或其他技术来改进应用程序的建议。
所需代码如下:-
/* Scheduler */
private long triggerDetection(String startDate, String endDate) {
for (UrlRequest request : urlRequests) {
if (!validateRequests.isWhitelisted(request)) {
ContentDetectionClient.detectContent(request);
}
}
}
/* Client */
public void detectContent(UrlRequest urlRequest){
Client client = new Client();
URI uri = buildUrl(); /* It returns the URL of this dropwizard application's resource method provided below */
ClientResponse response = client.resource(uri)
.type(MediaType.APPLICATION_JSON_TYPE)
.post(ClientResponse.class, urlRequest);
Integer status = response.getStatus();
if (status >= 200 && status < 300) {
log.info("Completed request for url: {}", urlRequest.getUrl());
}else{
log.error("request failed for url: {}", urlRequest.getUrl());
}
}
private URI buildUrl() {
return UriBuilder
.fromPath(uriConfiguration.getUrl())
.build();
}
/* Resource Method */
@POST
@Path("/pageDetection")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
/**
* Receives the url of the publisher, crawls the content of that url, applies a detector to check if the content is malicious.
* @returns returns the probability of the page being malicious
* @throws throws exception if the crawl call failed
**/
public DetectionScore detectContent(UrlRequest urlRequest) throws Exception {
return contentAnalysisOrchestrator.detectContentPage(urlRequest);
}
/* Orchestrator */
public DetectionScore detectContentPage(UrlRequest urlRequest) {
try {
Pair<Integer, HtmlPage> response = crawler.rawLoad(urlRequest.getUrl());
String content = response.getValue().text();
DetectionScore detectionScore = detector.getProbability(urlRequest.getUrl(), content);
contentDetectionResultDao.insert(urlRequest.getAffiliateId(), urlRequest.getUrl(),detectionScore.getProbability()*1000,
detectionScore.getRecommendation(), urlRequest.getRequestsPerUrl(), -1, urlRequest.getCreatedAt() );
return detectionScore;
} catch (IOException e) {
log.info("Error while analyzing the url : {}", e);
throw new WebApplicationException(e, Response.Status.INTERNAL_SERVER_ERROR);
}
}
我正在考虑以下方法:-
我没有通过 POST 调用 dropwizard 资源方法,而是直接从调度程序调用 orchestrator.detectContent(urlRequest)
。
编排器可以返回检测分数,我会将所有检测分数存储在 map /表中,并执行批量数据库插入,而不是像当前代码中那样进行单独插入。
我想对上述方法以及可能的其他技术进行一些评论,通过这些技术可以提高运行时间。另外,我刚刚阅读了有关 Java 异步编程的内容,但似乎无法理解如何在上面的代码中使用它,因此也希望获得一些帮助。
谢谢。
编辑:我可以想到两个瓶颈:
系统有 8 GB 内存,其中 4 GB 似乎可用
$ free -m
total used free shared buffers cached
Mem: 7843 4496 3346 0 193 2339
-/+ buffers/cache: 1964 5879
Swap: 1952 489 1463
CPU 使用率也极低:
top - 13:31:19 up 19 days, 15:39, 3 users, load average: 0.00, 0.00, 0.00
Tasks: 215 total, 1 running, 214 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.5%us, 0.0%sy, 0.0%ni, 99.4%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 8031412k total, 4605196k used, 3426216k free, 198040k buffers
Swap: 1999868k total, 501020k used, 1498848k free, 2395344k cached
最佳答案
首先检查一下你大部分时间都在哪里丢失。
我想大部分时间都浪费在了下载网址上。
如果下载 url 花费了超过 90% 的时间,那么您可能无法改进您的应用程序,因为瓶颈不是 java,而是您的网络。
<小时/>仅当下载时间在网络能力范围内时才考虑以下内容
如果下载时间不是太长,您可能可以尝试提高性能。标准方法是使用生产者消费者链。请参阅here了解详情。
基本上,您可以按如下方式划分工作:
Downloading --> Parsing --> Saving
下载是生产者,解析是下载过程的消费者,保存过程是生产者,保存是消费者。
每个步骤可以由不同数量的线程执行。例如,您可以有 3 个下载线程、5 个解析线程和 1 个保存线程。
<小时/>评论后编辑
假设瓶颈不是CPU时间,所以对java代码进行干预并不重要。
如果您知道每天下载多少千兆字节,则可以查看它们是否接近网络的最大带宽。
如果发生这种情况,有不同的可能性:
Content-Encoding: gzip
请求压缩内容(从而减少使用的带宽)关于Java:使用异步编程优化应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32740637/
我正在尝试打印 timeval 类型的值。实际上我可以打印它,但我收到以下警告: 该行有多个标记 格式“%ld”需要“long int”类型,但参数 2 的类型为“struct timeval” 程序
我正在编写自己的 unix 终端,但在执行命令时遇到问题: 首先,我获取用户输入并将其存储到缓冲区中,然后我将单词分开并将它们存储到我的 argv[] 数组中。IE命令是“firefox”以启动存储在
我是 CUDA 的新手。我有一个关于一个简单程序的问题,希望有人能注意到我的错误。 __global__ void ADD(float* A, float* B, float* C) { con
我有一个关于 C 语言 CGI 编程的一般性问题。 我使用嵌入式 Web 服务器来处理 Web 界面。为此,我在服务器中存储了一个 HTML 文件。在此 HTML 文件中包含 JavaScript 和
**摘要:**在代码的世界中,是存在很多艺术般的写法,这可能也是部分程序员追求编程这项事业的内在动力。 本文分享自华为云社区《【云驻共创】用4种代码中的艺术试图唤回你对编程的兴趣》,作者: break
我有一个函数,它的任务是在父对象中创建一个变量。我想要的是让函数在调用它的级别创建变量。 createVariable testFunc() [1] "test" > testFunc2() [1]
以下代码用于将多个连续的空格替换为1个空格。虽然我设法做到了,但我对花括号的使用感到困惑。 这个实际上运行良好: #include #include int main() { int ch, la
我正在尝试将文件写入磁盘,然后自动重新编译。不幸的是,某事似乎不起作用,我收到一条我还不明白的错误消息(我是 C 初学者 :-)。如果我手动编译生成的 hello.c,一切正常吗?! #include
如何将指针值传递给结构数组; 例如,在 txt 上我有这个: John Doe;xxxx@hotmail.com;214425532; 我的代码: typedef struct Person{
我尝试编写一些代码来检索 objectID,结果是 2B-06-01-04-01-82-31-01-03-01-01 . 这个值不正确吗? // Send a SysObjectId SNMP req
您好,提前感谢您的帮助, (请注意评论部分以获得更多见解:即,以下示例中的成本列已添加到此问题中;西蒙提供了一个很好的答案,但成本列本身并未出现在他的数据响应中,尽管他提供的功能与成本列一起使用) 我
我想知道是否有人能够提出一些解决非线性优化问题的软件包的方法,而非线性优化问题可以为优化解决方案提供整数变量?问题是使具有相等约束的函数最小化,该函数受某些上下边界约束的约束。 我已经在R中使用了'n
我是 R 编程的初学者,正在尝试向具有 50 列的矩阵添加一个额外的列。这个新列将是该行中前 10 个值的平均值。 randomMatrix <- generateMatrix(1,5000,100,
我在《K&R II C 编程 ANSI C》一书中读到,“>>”和“0; nwords--) sum += *buf++; sum = (sum >>
当下拉列表的选择发生变化时,我想: 1) 通过 div 在整个网站上显示一些 GUI 阻止覆盖 2)然后处理一些代码 3) 然后隐藏叠加层。 问题是,当我在事件监听器函数中编写此逻辑时,将执行 onC
我正在使用 Clojure 和 RESTEasy 设计 JAX-RS REST 服务器. 据我了解,用 Lisp 系列语言编写的应用程序比用“传统”命令式语言编写的应用程序更多地构建为“特定于领域的语
我目前正在研究一种替代出勤监控系统作为一项举措。目前,我设计的用户表单如下所示: Time Stamp Userform 它的工作原理如下: 员工将选择他/她将使用的时间戳类型:开始时间、超时、第一次
我是一名学生,试图自学编程,从在线资源和像您这样的人那里获得帮助。我在网上找到了一个练习来创建一个小程序来执行此操作: 编写一个程序,读取数字 a 和 b(长整型)并列出 a 和 b 之间有多少个数字
我正在尝试编写一个 shell 程序,给定一个参数,打印程序的名称和参数中的每个奇数词(即,不是偶数词)。但是,我没有得到预期的结果。在跟踪我的程序时,我注意到,尽管奇数词(例如,第 5 个词,5 %
只是想知道是否有任何 Java API 可以让您控制台式机/笔记本电脑外壳上的 LED? 或者,如果不可能,是否有可能? 最佳答案 如果你说的是前面的 LED 指示电源状态和 HDD 繁忙状态,恐怕没
我是一名优秀的程序员,十分优秀!