Chcę zapobiec zbyt szybkiemu wysyłaniu żądań z ajax przez użytkowników. Napisałem walidację w kontrolerze jak poniżej.

def before_action
    if session[:expires_at].nil?
       logger.info "Operation is legal"
       session[:expires_at] = Time.current + 3.seconds
    elsif Time.current > session[:expires_at].to_time
       logger.info "Operation is legal"
       session[:expires_at] = Time.current + 3.seconds
    else
       logger.info "Error: Operation too fast"
       render json: { msg: "Operation too fast",res: "Err"}
       return
    end
    sleep 2 <-- The issue happends here
end

Sen 2 sekundy oznacza czas wykonania mojego programu. Jeśli usunę sen 2 sekundy, wszystko działa dobrze. Wynik byłby jak poniżej, gdy wysyłam żądania naprawdę szybko.

-----------Logs-------------
Operation is legal
Error: Operation too fast
Error: Operation too fast
Error: Operation too fast
Error: Operation too fast
Error: Operation too fast
Operation is legal
Error: Operation too fast
Error: Operation too fast
Error: Operation too fast
----------------------------

Ale jeśli drugie lub więcej wniosków zostało wysłanych przed zakończeniem pierwszego. Wynik byłby nieoczekiwany. Jeśli dodam sen 2 w kodzie weryfikacyjnym.

-----------Logs-------------
Operation is legal
Operation is legal
Operation is legal
Error: Operation too fast
Error: Operation too fast
Error: Operation too fast
Error: Operation too fast
Operation is legal
Operation is legal
Error: Operation too fast
Error: Operation too fast
----------------------------

Jestem całkowicie zdezorientowany tą sytuacją. Czy wartość sesji nie zostanie zapisana przed zakończeniem żądania? Jak mam naprawić ten problem?

1
david0116 21 listopad 2018, 10:01

1 odpowiedź

Najlepsza odpowiedź

Wygląda na to, że zmienne sesji będą przechowywane później podczas przetwarzania cyklu życia kontrolera? obejściem może być użycie redis w tym przypadku?

Powinieneś znaleźć sposób, aby upewnić się, że zmienna, której używasz, jest trwała dla większej liczby równoległych żądań.

1
devanand 21 listopad 2018, 13:18