У нас есть приложение Grails, которое использует RabbitMQ для передачи сообщений. Архитектура для производственной среды:
- 2 веб-сервера, скажем, web1, web2. Оба они запускают экземпляр приложения Grails
- сервер RabbitMQ установлен только на одном из серверов, web1
- В конфигурации RabbitMQ в приложении Grails у нас есть 10 потребителей (на экземпляр приложения)
У нас есть задание Quartz, которое создает некоторые сообщения и передает их в очередь, а у нас есть служба поддержки пользователей, которая обрабатывает поступающие в очередь сообщения.
1. Как мы можем определить, какой сервер (экземпляр приложения) должен выполнить задание Quartz? Я предполагаю, что есть только один сервер, на котором работает Job, и Quartz позаботится об этом.
2. Как мы можем определить, какой сервер обрабатывает сообщения из очереди?
Проблема в том, что методы, которые используют сообщения очереди, в конечном итоге записывают несколько строк в файл .csv, который находится в NFS.
Изначально у нас было проблем , с фактической записью в файл .csv. В файле было несколько «сломанных» наполовину записанных строк, но мы решили эту проблему, добавив @Synchronized к методу, который записал в файл .csv. Теперь проблема в том, что некоторые строки просто не пишутся вообще.
Есть идеи? Я не уверен, является ли это проблемой программирования, и если да, то как ее можно решить, или это архитектурная проблема.
UPD : @ Олександр
Изначально у меня был (пример)
def getStringsToWrite(File file, List someOtherList) {
def stringsList = []
someOtherList.each {
def someString = "someString"
stringsList << someString
}
writeRowsToFile(file, stringsList)
}</p>
<p>@Synchronized
def writeRowsToFile(File file, List stringsList) {
file.withWriterAppend {out->
stringsList.each {row->
out.writeLine row
}
}
}
И он не работал "должным образом"
Теперь я изменил код на что-то вроде:
class someServiceClass { //singleton
<strong>LinkedBlockingQueue csvWritingQueue = new LinkedBlockingQueue()</strong> </p>
<p>def getStringsToWrite(File file, List someOtherList) {
def stringsList = []
someOtherList.each {
def someString = "someString"
<strong>csvWritingQueue.put(someString)</strong>
}
writeRowsToFile(<strong>file</strong>)
}</p>
<p>@Synchronized
def writeRowsToFile(File file) {
file.withWriterAppend {out->
<strong>while (!csvWritingQueue.isEmpty()) {</strong>
<strong>out.writeLine csvWritingQueue.poll()</strong>
}
}
}
}
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация. Я пытался держать его на высоком уровне, но я буду более чем рад включить в пост какой-то код.
Заранее спасибо,
Ираклис