2010-12-30 4 views
8

나는 역사적으로 PHP/MySQL 스택에 구축 된 웹 응용 프로그램에서 작업하고 있습니다.상태 기반 웹 서버를 사용하는 것이 합리적입니까?

응용 프로그램의 주요 조작 중 하나는 전체 DB 테이블의 모든 행을 반복해야하는 많은 계산을해야했습니다. 말할 필요도없이 심각한 병목 현상이었습니다. 따라서 Java로 전체 프로세스를 다시 작성하기로 결정했습니다.

이렇게하면 두 가지 이점이 있습니다. 하나는 언어로서 자바가 PHP 프로세스보다 훨씬 빠르다는 것입니다. 두 번째는 Java 애플리케이션 서버 메모리에 전체 데이터 세트를 유지할 수 있다는 것입니다. 이제 우리는 계산량이 많은 연산을 메모리에서 수행 할 수 있으며 모든 것이 훨씬 빨라졌습니다.

규모가 필요하다는 것을 깨달을 때까지 잠시 동안 작업했기 때문에 더 많은 웹 서버가 필요합니다.

문제는 - 현재 디자인으로는 모두 똑같은 상태를 유지해야합니다. 그들은 모두 DB를 쿼리하고, 데이터를 처리하고, 메모리에서 유지 관리합니다. 그러나이 데이터를 변경해야 할 때 어떻게됩니까? 모든 서버는 어떻게 일관성을 유지합니까?

이 아키텍처는 나에게 결함이있는 것처럼 보입니다. 모든 데이터를 메모리에 저장하면 성능 이점을 얻을 수 있지만 이는 확장 성을 심각하게 저해합니다.

여기에서 선택할 수있는 옵션은 무엇입니까? 메모리 내 키 - 값 데이터 저장소로 전환 하시겠습니까? 우리는 웹 서버 내부의 상태를 완전히 포기해야합니까?

답변

4

는 지금이 농담,

그래 :-) 얼랑로 전환; 하지만 진실이 있습니다. 문제는 원래 외부의 공유 저장소 인 DB에 자신의 상태가 있었기 때문입니다.이제 내부 비공유 저장소 (Java RAM 객체)에서 미리 계산됩니다 (부분적으로). 확실한 방법은 여전히 ​​미리 계산되도록하는 것이지만 외부 공유 저장소에서는 더 빨리 수행하는 것이 더 빠릅니다.

하나의 쉬운 대답은 memcached입니다.

또 다른 하나는 계산 작업과 (부분) 결과를 중앙 집중화하는 '계산 서버'를 만드는 것입니다. 웹 프론트 엔드 프로세스는이 서버에 액세스합니다. Erlang에서는 그것을하는 자연스러운 방법이 될 것입니다. 다른 언어에서는, 당신은 그것을 할 수 있고, 더 많은 일을 할 수 있습니다. ZeroMQ를 사용하지 않아도 영감을 얻을 수 있는지 확인하십시오 (하지만 좋은 구현 방법입니다).

+0

+1 진실의 곡물. – duffymo

1

이것은 진부하지만 데이터가 항상 사용자가 입력 한 공간을 채우기 위해 확장됩니다. 데이터가 모두 메모리에 저장 될 수는 있지만 나중에는 그렇지 않을 수도 있습니다. 얼마나 멀리 떨어져 있느냐가 더 나은 아키텍처를 찾아야하는 시간 프레임입니다. 응용 프로그램의 상태 기록은이 큰 문제의 증상 일뿐입니다.

모두가 전체 데이터 세트에서 다른 계산을 수행합니까? 하룻밤 사이에 할 수있는 일이며 낮에는 사람들이 이용할 수 있습니까? 얼마나 시간에 민감합니까?

나는 당신이 당신이 필요한 데이터를 저장하기에 충분한 memeory를 살 수 없을 것이라는 점을 당신이 대답 할 필요가있는 질문이라고 생각한다. 그것은 당신이 지금있는 곳에서 어리석게 들릴지도 모르지만, 그것이 사실이라는 것을 계획해야합니다. 내가 이야기 한 많은 개발자들은 성공의 모양과 디자인에 어떤 영향을 미치는지 생각하지 않습니다.

+0

전적으로 동의합니다. 우리는이 모든 데이터를 메모리에 보관하는 것이 문제가되는 시점에 도달 할 것입니다. 이 상황을 위해 어떤 해결책이 있습니까? K-V 데이터 저장소가 옵션입니까? 모든 웹 서버에 대해 한 번만 저장 하시겠습니까? 또는 원시 데이터가 백엔드의 무거운 DB에 저장되는 경우 쉽게 액세스해야하는 메타 데이터를 어디에 저장합니까? –

+0

나는 당신을 돕기 위해 데이터 나 계산의 성격에 대해 충분히 모른다. – n8wrl

1

나는 당신에게 동의한다 - 이것은 결함이있는 것처럼 들리지만, 확실히 알기 위해서는 더 자세한 정보가 필요하다.

대용량 데이터 집합 및 많은 계산이 있지만 데이터가 어떻게 업데이트되는지, 계산이 완료되었는지, 하루의 데이터인지 또는 전체 데이터 집합인지 등은 말하지 않습니다. 매일 오프라인으로 할 수있는 배치 작업과 비슷합니다.

그렇다면 웹이 어디에 연관되어 있는지 확실하지 않습니다. 귀하의 웹 사용자가 단지 사용자 정의 쿼리를 수행하는 후 처리가 완료됩니까? 데이터는 사용자에게 읽기 전용입니까, 읽기 전용입니까? 아니면 그들은 계속해서 데이터를 계속 변경하고 있습니까?

내가 선택한 지속 기술이 영향을 미치는지 궁금합니다. 아마도 분산 된 MongoDB 클러스터처럼 NoSQL 대안이 문제에 대해 더 나을 수도 있습니다.

+0

일반적으로 말하자면, 과도한 계산을 빠르게하는 데 도움이되는 메타 데이터를 저장하는 것이 적절한 이유는 무엇입니까? –

1

이것은 웹 서버 배포 질문만큼 데이터 엔진 문제입니다. 왜 (중앙) 데이터베이스 엔진이 계산을 빨리 할 수 ​​없습니까?

원래 데이터가 변경 될 때 오래된 값으로 표시되는 미리 계산 된 값을 저장할 수 있습니다. 다시 계산해야합니다. 데이터가 변경 될 때 다시 계산할 필요가 없습니다. 변경 사항이 데이터 소비자에게 영향을 미치기 때문에 변경 사항이 언제 어떻게 발생하는지 관리해야합니다.

+0

데이터베이스는 원시 데이터 만 보유합니다. 원시 데이터에서 파생 된 메타 데이터를 보유하도록 구축되지 않았습니다. –

+1

데이터 "메타 데이터"를 기반으로 계산을 호출하는 것이 적절하지 않다고 생각합니다. 그 용어는 오도 될 수 있습니다. 메타 데이터는 데이터에 관한 데이터이며 데이터에서 파생 된 데이터는 아닙니다. 어쨌든, 데이터 엔진은 질문을 해결하기위한 적절하고 간단한 장소 인 IMO입니다. 데이터 엔진은 계산 용량을 가지며 데이터베이스 구조는 확장 가능합니다. 대안은 데이터의 클라이언트 사용자가 변경 게시 서비스에 가입하여 핵심 데이터 세트의 로컬 분산 복사본을 새로 고칠 수있는 복잡한 구성입니다. – Tim

관련 문제