동시성은 흥미로운 용어이다. 동시성 외에도 비동기, 병렬, 스레드라는 용어를 들어봤을 수도 있다. 대부분의 사람은 대개 하나 이상의 프로세스와 동시에 발생하는 프로세스를 나타낼 때 동시라는 용어를 사용한다. 이 말은, 일반적으로 이 모든 프로레스들이 거의 동시에 수행되고 있음을 암시한다.
과잉 병렬에 해당할 경우 프로그램에서 더 많은 코어를 사용할 수 있게 만들어 성능을 상당히 향상할 수 있다. 이때 병렬 처리된 결과를 어떻게 결합하고 저장하느냐가 새로운 문제로 떠오르게 된다.
과잉 병렬 문제의 경우, 수평적으로 확장할 수 있도록 애플리케이션을 작성할 것을 권한다. 수평 확장이 가능하다는 것은 프로그램의 인스턴스를 가져와 더 많은 cpu나 기기에서 실행할 수 있으며, 이로 인해 시스템의 실행 시간이 향상된다는 의미이다.
과잉 병렬 문제는 이 모델에 매우 적합한데, 애플리케이;션의 서로 다른 인스턴스에게 문제의 일부를 노밸 수 있는 방식으로 프로그램을 구성하기가 매우 쉽기 때문이다.
클라우드 컴퓨팅이라는 새로운 패러다임이 장악하기 시작한 2000년대 초반에는 수평적 확장이 훨씬 쉬어졌다. 클라우드 컴퓨팅은 애플리케이션 배포 및 수평 확장에 대한 새로운 종류의 스케일링 접근 방식을 시사한다.
그러나 클라우드 컴퓨팅이 새롭게 제시한 도전 과제도 많이 생겨났다. 이러한 자원들을 프로비저닝하고 장비 인스턴스 간 통신과 결과를 집계하고 저장하는 문제를 모두 해결해야 했다.
무엇보다도 코드를 동시적으로 모델링하는 방법을 이해하는 문제가 가장 어려웠다. 하지만 이러한 사안들이 성공적으로 해결되면서 곧 웹 스케일 이라는 새로운 유형의 소프트웨어 브랜드로 이어졌다.
어떤 소프트웨어가 웹 스케일이라면, 해당 소프트웨어는 과잉 병렬일 것이라고 예상할 수 있다. 즉, 웹 스케일 소프트웨어는 일반적으로 애플리케이션의 인스턴스들을 추가함으로써 수십만 또는 그 이상의 동시 작업 부하를 처리할 것이다.
웹 스케일은 롤링 업그레이드, 탄력적인 수평 확장이 가능한 아키텍처, 지리적 분산 같은 모든 종류의 속성을 가능하게 했다.
동시성 코드를 제대로 작성하는 것은 어렵기로 유명하다. 생각대로 동작하려면 일반적으로 반복 작업을 몇 번이나 해야 한다. 심지어 디스크 사용량이 많아지고 시스템에 로그인한 사용자가 늘어나는 등 타이밍이 약간 변경돼, 기존에는 발견되지 않고 한참 동안 소스 코드 속에 숨어있던 버그가 고개를 드는 경우가 많다.
레이스 컨디션은 둘 이상의 작업이 올바른 순서로 실행돼야 하지만 프로그램이 그렇게 작성되지 않아서 이 순서가 유지 되는 것이 보장되지 않을 때 발생한다.
대부분 이 문제는 하나의 동시 작업이 어떤 변수를 읽으려고 시도하는 동안 또 다른 동시 작업이 특정할 수 없는 시점에 동일 변수에 값을 쓰려고 하는 데이터 레이스인 것으로 밝혀졌다.
고 에서는 go 키워드를 사용하여 고루틴을 만들어 동시성을 활용할 수 있다.
몇 줄의 잘못된 코드로 인해 프로그램에 엄청난 변동성을 나타낼 수 있는데, 대부분의 데이터 레이스는 개발자가 문제를 순차적으로 생각하기 때문에 일어난다. 동시성 코드를 작성할 때는 가능한 한 시나리오를 세심하게 반복해야 한다.
때로는 연산들 사이에 많은 시간적 공백이 있다고 상상하는 것이 도움이 된다는 사실을 알아야 한다. 사실 일부 개발자는 코드 전체에 걸쳐 슬립을 뿌리는 잘못을 범한다.
슬립이 동시성 문제를 해결하는 것처럼 보이기 때문이다.