이러한 종류의 문제와 관련된 가능한 도구의 범위는 광범위하지만 Django를 사용하고 있습니다.웹 프레임 워크에서 작업자 동기화, 즉 Django
우리가 관심있는 시스템에서 우리는 2 종류의 근로자를 사용합니다. gunicorn
작업자가 django 뷰를 담당해야하는 경우 celery
은 비동기 적으로 실행되어야하는 일부 루틴을 담당합니다. 두 유형의 작업자 모두 데이터베이스에서 읽고 쓸 수 있으므로 아래에서는 간단히 workers
이라고합니다.
>>> from someapp.models import mymodel
>>> foo = mymodel(field1='bar', field2='baz')
>>> foo.save()
>>> foo.id
5
을
>>> foo = mymodels.objects.get(id=5)
>>> foo.field1
'bar'
는 사례 연구를 할 수 있습니다, 다음과 같이 같은
foo
개체를 얻을 수 있습니다, 그것은 DB에 존재 주어진 다음과 같이
하나는 데이터베이스 작업을 수행 할 수 ;
이 시스템에 운영이 명 노동자, 그리고 같은 시간에 그들은 다음
# Both processes
foo = mymodel.objects.get(id=5)
mymodel
에서 같은 행을 읽고, 근로자 1 field1
# Worker 1
foo.field1 = 'bird'
'bird'
에 노동자 2 변경 변경 field2
to 'dinosaur'
# Worker 2
foo.field2 = 'dinosaur'
이 시점에서
은 데이터베이스에 아무 것도 기록되지 않습니다.
# Worker 1
foo.save()
것처럼 관련 행의 변경이 발생
# Worker 2
foo.save()
경우이 수술 후
id | field1 | field2
-----+---------+------
5 | bird | baz
: 당신이 동의하는 것처럼
id | field1 | field2
-----+---------+------
5 | bar | dinosaur
, 이것은이다 심각한 동기화 문제. 이것을 해결하는 우아한 방법이 있습니까? 어떻게해야합니까?
한가지는이 문제는 너무 분명합니다. 그러나 인터넷에서 나는 여기에서 설명한 것을 언급하지 않았기 때문에이 문제의 타당성에 대해 의심을 품게되었습니다.