Мне нужно написать потоковое приложение Rails, потому что я запускаю его поверх Neo4j.rb, который включает в себя базу данных диаграммы Neo4j внутри процесса Rails, и поэтому я должен обслуживать несколько запросов из одного и того же процесса. Да, было бы здорово, если бы соединение с базой данных Neo4j работало подобно базам данных SQL, но это не так, поэтому я перестану жаловаться и просто его использовать.
Я очень обеспокоен последствиями написания параллельного кода (как и должно быть), и мне просто нужно дать совет о том, как обрабатывать общий общий сценарий - контроллер задает переменную экземпляра или переменную в хеш сессии, то происходит кое-что. Рассмотрим следующий грубый код, чтобы продемонстрировать, что я имею в виду:
# THIS IS NOT REAL PRODUCTION CODE
# I don't do this in real life, it is just to help me ask my question, I
# know about one-way hashing, etc.!
class SessionsController
def create
user = User.find_by_email_and_password(params[:email], params[:password])
raise 'auth error' unless user
session[:current_user_id] = user.id
redirect_to :controller => 'current_user', :action => 'show'
end
end
class CurrentUserController
def show
@current_user = User.find(session[:current_user_id])
render :action => :show # .html.erb file that uses @current_user
end
end
Вопрос: Существуют ли какие-либо условия гонки в этом коде?
В SessionController есть хеш session
и params
хэш-поток-локальный? Скажем, что тот же сеанс браузера делает несколько запросов /session # create (заимствовать синтаксис Rails-маршрута) с разными учетными данными, пользователь, который вошел в систему, должен быть запросом, который попадает в строку session[:current_user_id] = user.id
последним? Или я должен обернуть блокировку мьютекса вокруг действия контроллера?
В CurrentUserController, если действие show одновременно попадает в два запроса с разными сеансами, будет ли установлена одна и та же переменная @current_user обоими? То есть будет первый запрос, поскольку он обрабатывает файл .html.erb, обнаруживает, что переменная экземпляра @current_user неожиданно была изменена вторым потоком?
Спасибо