2014-11-25 29 views
7

Tôi đang cố gắng tìm ra cách hoạt động của Hystrix request caching nhưng không tuân theo wiki hoặc các ví dụ đầu cuối mà chúng cung cấp trong tài liệu của họ.Hystrix Yêu cầu Caching theo Ví dụ

Về cơ bản tôi có HystrixCommand lớp con sau:

public class GetFizzCommand extends HystrixCommand<Fizz> { 
    private Long id; 
    private Map<Long,Fizz> fizzCache = new HashMap<Long,Fizz>(); 

    void doExecute(Long id) { 
     this.id = id; 
     execute(); 
    } 

    @Override 
    public Fizz run() { 
     return getFizzSomehow(); 
    } 

    @Override 
    public Fizz getFallback() { 
     // Consult a cache somehow. 
     // Perhaps something like a Map<Long,Fizz> where the 'id' is the key (?) 
     // If the 'id' exists in the cache, return it. Otherwise, give up and return 
     // NULL. 
     fizzCache.get(id); 
    } 
} 

Vì vậy, tôi cảm thấy như tôi đang đi ngược lại các hạt ở đây. Tôi tin rằng Hystrix cung cấp bộ nhớ đệm tích hợp, như được minh họa bằng một số 'cacheKey', nhưng tôi không thể tìm thấy bất kỳ ví dụ hoạt động nào. Tôi không muốn phát minh lại bánh xe ở đây và xây dựng bộ nhớ đệm vào lệnh của tôi nếu một cái gì đó đã được cung cấp ra khỏi hộp.

Vì vậy, tôi hỏi: yêu cầu bộ nhớ đệm trông giống như thế nào với Hystrix (chính xác)? Các mục nhập được thêm vào bộ nhớ cache như thế nào? Làm thế nào/khi bộ nhớ cache đỏ ửng? Có thể định cấu hình (hết hạn, kích thước tối đa, v.v ...) không?

+1

Bạn có thể đọc phần triển khai HystrixCommand. Điểm bắt đầu sẽ là phương thức [HystrixCommand.isResponseFromCache())] (http://grepcode.com/file/repo1.maven.org/maven2/com.netflix.hystrix/hystrix-core/1.3.3/com/ netflix/hystrix/HystrixCommand.java # HystrixCommand.isResponseFromCache()) (liên kết đến * grepcode.com *). – MicSim

Trả lời

6

mỗi tài liệu bạn liên kết với here,

Yêu cầu bộ nhớ đệm được kích hoạt bằng cách thực hiện phương pháp getCacheKey() trên một đối tượng HystrixCommand ...

Bạn chưa thực hiện getCacheKey(),

@Override 
protected String getCacheKey() { 
    return String.valueOf(id); // <-- changed from `value` in example 
} 

Sau đó, bạn cũng cần HystrixRequestContext

HystrixRequestContext context = HystrixRequestContext.initializeContext(); 

Đó là (một lần nữa, mỗi tài liệu)

Điển hình là trường hợp này sẽ được khởi tạo và tắt máy thông qua một ServletFilter bọc lấy một yêu cầu người sử dụng hoặc một số móc vòng đời khác.

Sau đó, tôi tin rằng bạn không thể thay đổi chữ ký phương pháp execute() như thế (doExecute() không phải là một phần của giao diện) thay vào đó bạn vượt qua các tham số để constructor lệnh của bạn và xin vui lòng chú thích execute với một @Override để bạn có được một trình biên dịch nếu bạn quên và sau đó

HystrixRequestContext context = HystrixRequestContext.initializeContext(); 
GetFizzCommand commandA = new GetFizzCommand(2L); 
GetFizzCommand commandB = new GetFizzCommand(2L); 
Fizz a = commandA.execute(); // <-- should not be cached 
Fizz b = commandB.execute(); // <-- should be cached. 
Các vấn đề liên quan