2

여러 도메인을 통해 제공되는 Google App Engine Python 표준 환경에서 Flask로 API를 작성하고 있습니다.Google App Engine API의 네임 스페이스 관리자의 범위는 무엇입니까?

API는 데이터를 저장하고 데이터를 가져 오는 데 사용할 수 있습니다.

API가 액세스되는 도메인에 의해 결정된 네임 스페이스에서만 데이터를 저장하거나 가져 오기 위해 클라우드 데이터 저장소의 멀티 테넌시를 사용하고 싶습니다.

이 작업을 수행하는 유일한 방법은 요청시 또는 I/O 시간에 컨텍스트 관리자에서 google.appengine.api.namespace_manager을 사용하여 네임 스페이스를 설정하는 것입니다.

나는 이러한 맥락 관리자 썼다 :

@contextmanager 
def multitenancy_namespace(namespace): 
    original_namespace = namespace_manager.get_namespace() 
    if namespace: 
     new_namespace = to_namespace_safe_url(namespace) 
     namespace_manager.set_namespace(new_namespace) 

    yield 

    namespace_manager.set_namespace(original_namespace) 

을 그리고 예상대로 작동합니다.

내 걱정은 namespace_manager입니다. 나는 이것에 대한 어떠한 문서도 찾을 수 없었다.

내 사용자 인터페이스가 namespace_manager.set_namespace(...)으로 설정된 네임 스페이스를 전역으로 가정 할 때 1000 명이 넘는 사용자가 동시에 스레드를 사용하면 첫 번째 요청 후 set_namespace이라는 다른 요청이 발생하여 데이터가 잘못된 네임 스페이스에 저장 될 것으로 예상됩니다. 하지만 첫 번째 요청이 I/O를 수행하기 전에

내가 통과 한 스레드 테스트 here을 작성했는데, 이는 namespace의 범위가 개별 스레드 (적어도 내 Flask 응용 프로그램에 충분 함)에 국한되어 있음을 알려줍니다.

그러나 namespace_manager의 맥락입니까? set_namespace은 실제로 무엇을합니까? 네임 스페이스 설정은 어디에 저장됩니까? 네임 스페이스 충돌이 일 수있는 사용 사례가 있습니까?

답변

1

당신이 namespace_manager.set_namespace(...)source code에 보면 당신은 환경 변수로 설정하여 네임 스페이스를 수행 볼 수 있습니다 다음 AppEngine에 필요에 따라 & 환경 변수를 복원 백업 스레드 컨텍스트 스위치 때

def set_namespace(namespace): 
    """Set the default namespace for the current HTTP request. 
    Args: 
    namespace: A string naming the new namespace to use. A value of None 
     will unset the default namespace value. 
    """ 
    if namespace is None: 
    os.environ.pop(_ENV_CURRENT_NAMESPACE, None) 
    else: 
    validate_namespace(namespace) 
    os.environ[_ENV_CURRENT_NAMESPACE] = namespace 

. 그것들은 사용자의 코드에 불투명 해 지도록 (듯이) 제한된 요구가 보증되고 있습니다. 이 문서가 있다면 기억이 안납니다. 일부 포럼 스레드에서 이것을 배웠다고 생각합니다.

의견 Set the default namespace for the current HTTP request은 암묵적으로이를 확인합니다.

우리는 몇 년 동안 www.myclasses.org에서 사용하며 결코 문제가되지 않습니다.

그래서 긴장을 풀면 멀티 스레드 환경에서 사용해도 안전합니다!

+0

분명히 문서에서 그런 것을 보지 못했습니다. 설명해 주셔서 감사합니다! – Charles

+1

조금 쉬워. 메소드에 대한 주석은 다소 확실합니다. "" "현재 HTTP 요청의 기본 네임 스페이스를 설정하십시오." –