2012-04-16 37 views
12

Tôi đang tìm kiếm thay thế "tại" có thể mở rộng, với tính khả dụng cao. Nó phải hỗ trợ thêm và xóa các công việc trong thời gian chạy.Tìm kiếm triển khai "tại" có thể mở rộng

Một số nền: Tôi có một ứng dụng mà tôi kích hoạt hàng triệu sự kiện, mỗi sự kiện chỉ xảy ra một lần. Tôi không cần cron như cơ chế (chủ nhật đầu tiên của tháng, vv), chỉ đơn giản là ngày tháng, thời gian và bối cảnh.

Hiện tại tôi đang sử dụng Quartz scheduler và mặc dù đây là một dự án rất hay nhưng khó có thể xử lý số lượng sự kiện mà chúng tôi ném vào, ngay cả sau nhiều lần chỉnh sửa (sharding, tăng khoảng thời gian bỏ phiếu, v.v.) do khóa cơ bản nó thực hiện trên cơ sở dữ liệu gạch chân. Ngoài ra, nó là một chút overkill cho chúng tôi, về cơ bản chúng tôi có hàng triệu lần kích hoạt một lần, và số lượng tương đối nhỏ của công việc.

Tôi đánh giá cao bất cứ đề nghị

+0

gì là yêu cầu của bạn xung quanh thất bại? Ví dụ: nếu máy bị hỏng, bạn có muốn các sự kiện "bị nhỡ" kích hoạt khi có sự thay thế không? –

+0

Có, tương tự như Quartz. Ngoài ra, tôi chạy Quartz trong một cụm, vì vậy luôn luôn có một máy ấm chờ đợi (trong Quartz tất cả các nút cạnh tranh mỗi khi họ cần phải thăm dò ý kiến ​​của DB cho công việc) –

+0

Tôi đã tự hỏi làm thế nào đơn giản chúng tôi có thể làm cho mọi thứ * mà không có * Quartz. Nếu mọi công việc phải được thừa nhận mặc dù, điều đó làm cho nó phức tạp hơn. Hình phạt là gì nếu một công việc chạy hai lần? (Ví dụ, bạn có thể thừa nhận tất cả các công việc được thực hiện trong phút cuối, mỗi phút một lần?) –

Trả lời

0

Có lẽ chỉ cần sử dụng JGroupsshared tree với nhiệm vụ được sắp xếp theo thời gian thực hiện. Các nút sẽ thực hiện nhiệm vụ đầu tiên và lịch hẹn giờ, sẽ thực hiện tại thời điểm đã định. Khi xóa tác vụ, bộ hẹn giờ có thể bị hủy. Vì vậy, về cơ bản bạn chỉ có thể sử dụng JGroups và java Timers/Executors đơn giản.

Tôi đã không đọc nó cả, nhưng đây là một số proof of concept or maybe even solution

0

thế nào về bộ đếm thời gian java?

import java.util.*; 

public class MyTask extends TimerTask{ 
    public void run(){ 
     System.out.println("do it!"); 
    } 
} 

và sau đó

Timer timer = new Timer(); 

MyTask job1 = new MyTask(); 
// once after 2 seconds 
timer.schedule(job1, 2000); 

job1.cancel(); 

MyTask job2 = new MyTask(); 
// nach each 5 seconds after 1 second 
timer.schedule (job2, 1000, 5000); 
+0

1. Nó không tồn tại quá trình khởi động lại; 2. Làm thế nào để bạn mở rộng quy mô cho hàng triệu công việc? Đây là những gì Quartz nhằm giải quyết –

+0

1. Bạn không đề cập đến sự kiên trì là một yêu cầu; 2. Bạn nói có số lượng công việc tương đối nhỏ. – kromit

+0

Tôi xin lỗi, nhưng tôi đã đề cập đến "Tính khả dụng cao" và "Hàng triệu sự kiện/Hàng triệu lần kích hoạt một lần" ... –

1

Nếu tôi đã phải đối mặt với cùng một kịch bản tôi sẽ làm như sau ...

Thiết lập một hàng đợi JMS cụm (ví dụ RabbitMQ hoặc ActiveMQ) sử dụng một bản sao hàng đợi thiết lập qua một vài hộp.

Kích hoạt tất cả các sự kiện tại hàng đợi JMS có sẵn rất cao của tôi.

Sau đó, tôi sẽ viết mã một ứng dụng tác nhân popped các sự kiện trong hàng đợi JMS khi cần thiết, tôi có thể chạy nhiều đại lý trên nhiều hộp và đã có kết hợp với đúng JMS failover url, vv

Bạn cũng có thể sử dụng cùng một loại mô hình nếu công việc của bạn đang bắn các sự kiện ...

FYI, một cách đẹp hơn của lịch trong lõi Java là như sau:

ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(sensibleThreadCount); 
    threadPool.scheduleAtFixedRate(new Runnable() { 

    @Override 
    public void run() { 
     //Pop events from event queue. 
     //Do some stuff with them. 
    } 

    }, initialDelay, period, TimeUnit.X); 
Các vấn đề liên quan