2

Что происходит с моими статическими переменными, когда приложение-двигатель запускает новые экземпляры? Более конкретно, я использую очередь задач, которая может содержать 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() { 

    } 
    .. 
} 

У меня есть следующие вопросы:

  1. Так как это это очередь задач, мне нужно беспокоиться о том, что App-Engine запускает новые экземпляры для масштабирования с высокими требованиями?

  2. Имеет ли значение, является ли singleton внутренним классом класса WorkerThread или другим классом, к которому обращается класс WorkerThread?

  3. Являются ли очереди заданий независимыми? Верю, что они есть, но я не уверен.

Надеюсь, вопрос ясен. Я хочу, чтобы на всех экземплярах был только один экземпляр моего синглтона. Просьба уточнить, если вопрос не ясен.

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

ответ

2

Тяговое и толкающее очередиоба обрабатываются стандартными экземплярами (вы можете настроить таргетинг на модуль/frontend/backend в вашей queue.xml). Экземпляры будут масштабироваться для удовлетворения потребностей как вашего обычного трафика, так и ваших очередей.

Singletons (в классическом смысле, изображенном здесь) уникальны только для загрузчика классов, которые они загружают - они определенно не уникальны для всех экземпляров вашего приложения в appengine - ни одно государство не будет использоваться совместно. Используя этот шаблон, у вас будет один синглтон на экземпляр приложения.

Если вам нужно разделить состояние, вам нужно будет использовать хранилище данных/облако sql/something.

+0

Я использую Lucene для поиска. И я использую очередь задач для записи в индекс. Для Lucene требуется один IndexWriter, который сам по себе заботится о параллельных вызывающих (как я понимаю). Проект, который я использую, - https://code.google.com/p/lucene-appengine/, который утверждает, что я могу использовать Task Queue для масштабирования. Итак, как я масштабируюсь в такой ситуации? –

+0

Я добавил обновление к сообщению для большей детализации использования. –

+1

Я не использовал lucene на appengine - если бы я был вами, я бы рассмотрел полнотекстовый поиск api (который ограничен возможностями) или переместился в lucene или эластичный поиск на GCE. В среде автоматического масштабирования такое ограничение, вероятно, необоснованно. Сказав это, лучший способ иметь одну точку записи - это, вероятно, использование выносных очередей, вызванных заданием cron. Затем вы можете выполнить несколько сотен задач одновременно и записать их вместе. Затем вы можете использовать ставки cron и queue, чтобы гарантировать одновременную обработку только одной партии. Это не гарантирует, что все они будут работать на одном экземпляре. – Nick

Смежные вопросы