Что происходит с моими статическими переменными, когда приложение-двигатель запускает новые экземпляры? Более конкретно, я использую очередь задач, которая может содержать 40 экземпляров/поток. В Servlet в вопросе, я использую одиночку, как вПоведение синглетонов в очередях задач в приложении-движке
public class WorkerThread extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
..
MySingleton single = MySingleton.getInstance();
..
}
...
}
Вот как синглтон создается
public class MySingleton {
public static I MySingleton getInstance() {
return MySingletonHolder.INSTANCE;
}
private static class MySingletonHolder {
public static final MySingleton INSTANCE = new MySingleton();
}
private MySingleton() {
}
..
}
У меня есть следующие вопросы:
Так как это это очередь задач, мне нужно беспокоиться о том, что App-Engine запускает новые экземпляры для масштабирования с высокими требованиями?
Имеет ли значение, является ли singleton внутренним классом класса WorkerThread или другим классом, к которому обращается класс WorkerThread?
Являются ли очереди заданий независимыми? Верю, что они есть, но я не уверен.
Надеюсь, вопрос ясен. Я хочу, чтобы на всех экземплярах был только один экземпляр моего синглтона. Просьба уточнить, если вопрос не ясен.
UPDATE
Ниже мой точный случай использования
public class SingletonProductIndexWriter {
private static final Logger LOG = Logger.getLogger(SingletonProductIndexWriter.class.getName());
public static IndexWriter getSingleIndexWriter() {
return IndexWriterHolder.INDEX_WRITER;
}
private static class IndexWriterHolder {
static PorterAnalyzer analyzer = new PorterAnalyzer();
static GaeDirectory index = new GaeDirectory(LuceneWorker.PRODUCTS);// create product index
static IndexWriterConfig config = GaeLuceneUtil.getIndexWriterConfig(LuceneWorker.LUCENE_VERSION, analyzer);
public static final IndexWriter INDEX_WRITER = getIndexWriter();
private static IndexWriter getIndexWriter() {
try {
LOG.info("Create single index writer for workers");
return new IndexWriter(index, config);
}catch(IOException e){
return null;
}
}
}
}
называется
IndexWriter writer = SingletonProductIndexWriter.getSingleIndexWriter();
Для соответствующих деталей см Stack Overflow нить: Worker threads cause Lucene LockObtainFailedException
Я использую Lucene для поиска. И я использую очередь задач для записи в индекс. Для Lucene требуется один IndexWriter, который сам по себе заботится о параллельных вызывающих (как я понимаю). Проект, который я использую, - https://code.google.com/p/lucene-appengine/, который утверждает, что я могу использовать Task Queue для масштабирования. Итак, как я масштабируюсь в такой ситуации? –
Я добавил обновление к сообщению для большей детализации использования. –
Я не использовал lucene на appengine - если бы я был вами, я бы рассмотрел полнотекстовый поиск api (который ограничен возможностями) или переместился в lucene или эластичный поиск на GCE. В среде автоматического масштабирования такое ограничение, вероятно, необоснованно. Сказав это, лучший способ иметь одну точку записи - это, вероятно, использование выносных очередей, вызванных заданием cron. Затем вы можете выполнить несколько сотен задач одновременно и записать их вместе. Затем вы можете использовать ставки cron и queue, чтобы гарантировать одновременную обработку только одной партии. Это не гарантирует, что все они будут работать на одном экземпляре. – Nick