Thứ Tư, 27 tháng 4, 2011

Task Queues with google app engine

Thông thường với việc thực hiện crawler các trang web khác thì tại một thời điểm bạn chỉ có thể thực hiện một request đến trang craw,muốn tại một thời điểm gọi được nhiều request thì tương ứng bạn phải nhân lượng craw tại một thời điểm lên,công việc này thực sự không đem lại hiểu quả.Với task queues thì công việc này trở lên hết sức đơn giản,chỉ cần thực hiện một crawler bạn có thể thực hiện nhiều request tới url.Có thể hiểu một các đơn giản là task queues giúp bạn thực hiện các công việc được phân công một cách đồng thời.

Trước hết tạo file queue.xml trong WEB-INF có nội dung

<queue-entries>
<!--Change the refresh rate of the default queue to 1/s-->
<queue>
<name>default</name>  //ten tash queue se được gọi trong servlet
<rate>100/s</rate>  //số lầ thực hiện task queues trong 1s
</queue>
</queue-entries>

tạo một servlet để add các task queues.(DemoServlet.java)

package Showsiteinfo.cron;

import java.io.IOException;

import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.appengine.api.taskqueue.Queue;
import com.google.appengine.api.taskqueue.QueueFactory;
import com.google.appengine.api.taskqueue.TaskOptions.Method;

import static com.google.appengine.api.taskqueue.TaskOptions.Builder.*;

@SuppressWarnings("serial")

public class DemoServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");

for(int i=0;i<100;i++)
{
Queue queue = QueueFactory.getDefaultQueue();  //goi defaulse task queues được config trong file queue.xml
queue.add(withUrl("/queue").method(Method.GET).param("name", "abc"));  // goi url queue sử dụng phương thức get vói parameter name=abc
}
}

}

Vào web.xml chỉnh đường dẫn tới DemoServlet.java là /demo

Giờ nhiệm vụ của chúng ta là chay link /demo,như vậy sau 1s (có thể trễ 1 chút) chúng ta đã thực hiện được 100 request tới url /queue.

Hạn chế của google là không cho chúng ta gọi link từ domain hay một app khác mà chỉ có thể thực hiện trong chính app ma bạn đang thực hiện task queues.

5 nhận xét:

  1. Quả thực mình đang muốn thực hiện một tác vụ là lọc thông tin tự động từ các trang tin tức. Muốn sử dụng Task Queue để tăng tốc độ xử lý, nhưng Task Queue lại không hỗ trợ gọi link từ domain khác. Muốn sử dụng CronJob thì lại hạn chế bởi việc mỗi Request chỉ được thực hiện trong vòng 60s, mà tác vụ của mình thì lại chạy hơi lâu... Không biết giải quyết sao!!!

    Trả lờiXóa
  2. Việc này bạn có thể sử dụng Task Queue trong backend . Trong backend 1 request có thể sống rất lâu .

    Trả lờiXóa
  3. nlZrGo wqwecrwewjeq, [url=http://klhquemnrvhh.com/]klhquemnrvhh[/url], [link=http://rpgrwxiffdph.com/]rpgrwxiffdph[/link], http://dndxodtjcwic.com/

    Trả lờiXóa
  4. jqCmZj dmivnlyhcmgx, [url=http://wknejutxvbcj.com/]wknejutxvbcj[/url], [link=http://dbmqrbrzetes.com/]dbmqrbrzetes[/link], http://selgzeokvtgb.com/

    Trả lờiXóa
  5. TkpqUd xionsuvcxmgw, [url=http://dloixgcalvua.com/]dloixgcalvua[/url], [link=http://bjgkedpvidhq.com/]bjgkedpvidhq[/link], http://rmbcdzxdmcqh.com/

    Trả lờiXóa