설정 파일 (MANIFEST.json) 상세¶
MANIFEST.json 에서 dependency
항목에 추가할 수 있는 아이펀 엔진 기능들과 설정 가능한 파라미터는 다음과 같습니다.
Tip
기능 리스트는 알파벳 순으로 정렬되어있고 설정 파라미터는 자주 쓰이는 것들을 위에 나열하였습니다.
Tip
아래 기능들은 리눅스의 경우 /usr/share/funapi/manifests/*/MANIFEST.json
에,
윈도우즈의 경우 <아이펀 엔진 설치 경로>\share\funapi\manifests\*\MANIFEST.json
(기본 설치
경로: C:\Program Files\iFunFactory\iFunEngine\VS2019\share\funapi\manifests\*\MANIFEST.json
)
에 정의되어있습니다.
성능 최적화¶
EventDispatcher¶
아이펀 엔진에서 event 처리를 담당합니다.
event_threads_size: 메인 이벤트 쓰레드 개수. (type=uint64, default=4)
enable_event_profiler: 이벤트 프로파일러의 활성화 여부 (type=bool, default=true)
enable_outstanding_event_profiler: 현재 실행되는 이벤트들을 프로파일링할지 여부 (type=bool, default=true)
직접 설정을 바꿀 일이 거의 없는 파라미터들
slow_event_log_threshold_in_ms: 어느 정도로 느린 이벤트들을 로그로 남길지 지정 (type=uint64, default=300)
event_timeout_in_ms: 이벤트를 타임 아웃시킬 때까지 걸리는 밀리초 시간 (type=uint64, default=30000)
enable_inheriting_event_tag:
Event::Invoke()
를 호출할 때 별도의 event tag 를 지정하지 않을 경우, 호출한 event 의 event tag 를 상속 받을지 여부 (type=bool, default=true)enable_random_event_tag:
enable_inherit_event_tag
마저 활성화되지 않은 경우Event::Invoke()
를 아무 event tag 없이 호출할 때 랜덤하게 event tag 를 생성해서 부여할지 여부. 만일 false 이면 null event tag 를 부여함 (type=bool, default=true)enable_event_thread_checker: 만일 true 이면 event thread 가 처리 중 blocking 됐는지 여부를 1초에 한번씩 체크함 (type=bool, default=true)
max_rollback_cause_log_count: 이 설정이 0 보다 크다면 이벤트 내에서 롤백이 발생했을 때 이 설정만큼 저장했다가 로그로 출력합니다. (type=uint64, default=0)
IoService¶
I/O 처리를 위한 스레드 관리를 담당합니다. 내부적으로 boost::asio 의 io_service 에 대응합니다.
직접 설정을 바꿀 일이 거의 없는 설정들
internal_threads_size: 엔진 내부의 공용 쓰레드 개수. (type=uint64, default=4)
Object¶
게임 object 를 관리하는 ORM 을 담당합니다. 이는 게임 object 를 다루기 위한 lock, database 등의 복잡한 코드를 직접 구현하지 않아도 되도록 자동으로 처리합니다. 자세한 내용은 ORM Part 1: Overview 를 참고해주세요.
enable_database: 실제 데이터베이스와의 연동을 활성화합니다. 간단한 테스트 또는 개발 단계에서는 false 로 지정하면 DB 를 준비하지 않아도 됩니다. (type=bool, default=false)
db_mysql_server_address: ORM 이 사용할 DB 주소. (type=string, default=”tcp://127.0.0.1:3306”)
db_mysql_id: ORM 이 사용할 MySQL user id (type=string, default=””)
db_mysql_pw: ORM 이 사용할 MySQL password (type=string, default=””)
db_mysql_database: ORM 이 사용할 MySQL database 이름 (type=string, default=””)
cache_expiration_in_ms: DB 에서 읽어들여서 캐싱하고 있는 오브젝트를 캐시에서 내릴 때까지 밀리초 (type=int64, default=300000)
copy_cache_expiration_in_ms: 원격 서버로부터 오브젝트를 복사해온 경우 이 오브젝트를 캐시에서 내릴때까지 밀리 초 (type=int64, default=700)
enable_delayed_db_update: DB 업데이트를 그때마다 하지 않고 딜레이 했다가 batch 처리할지 여부 (type=bool, default=false)
db_update_delay_in_second: DB 업데이트를 바로 하지 않고 batch 하는 경우, 작업을 딜레이 하는 초단위 시간 (type=int64, default=10)
db_read_connection_count: 읽기 작업을 위한 DB 연결 개수 (type=int64, default=8)
db_write_connection_count: 쓰기 작업을 위한 DB 연결 개수 (type=int64, default=16)
db_key_shard_read_connection_count: DB 서버 Sharding 사용시 key database 에 읽기 작업을 위한 DB 연결 개수 (type=int64, default=8)
db_key_shard_write_connection_count: DB 서버 Sharding 사용시 key database 에 쓰기 작업을 위한 DB 연결 개수 (type=int64, default=16)
db_character_set: DB 의 character set. 아이펀 엔진은 DB 의 설정이 아닌 이 설정 값을 따름. (type=string, default=”utf8”)
export_db_schema: 만일 true 인 경우 DB 스키마 생성 스크립트를 출력하고 종료. 필요한 DB 권한 참고. (type=bool, default=false)
object_slow_query_threshold_time_in_ms: ORM 이 DB 에 요청한 쿼리에 대한 응답 지연이 이 시간보다 크면 서버 로그에 출력합니다. (type=uint64, default=5000)
직접 설정을 바꿀 일이 거의 없는 설정들
db_string_length: 문자열 속성의 경우 대응되는 SQL VARCHAR 길이 (type=int32, default=4096)
db_key_string_length: Key 인 문자열 속성의 경우 대응되는 SQL CHAR 의 길이 (type=int32, default=12)
use_db_stored_procedure: RAW SQL 문장 대신 stored procedure 를 사용할지 여부 (type=bool, default=true)
use_db_stored_procedure_full_name: 축약된 이름 대신 긴 이름의 stored procedure 를 사용할지 여부 (type=bool, default=true)
use_db_char_type_for_object_id: Object ID 를 표시하기 위해서 SQL DB 상에 BINARY(16) 대신 CHAR(32) 를 사용함 (type=bool, default=false)
enable_assert_no_rollback: 코드 상에
AssertNoRollback()
체크를 활성화 시킴. 원하지 않는 롤백 감지 참고. (type=bool, default=true)use_db_select_transaction_isolation_level_read_uncommitted: Select 쿼리를 실행할 때
TRANSACTION ISOLATION LEVEL
을READ UNCOMMITTED
로 설정. false 일 경우에는 mysql 의 기본값이 사용됨. (type=bool, default=true)
SessionService¶
아이펀 엔진의 네트워킹을 제어합니다. Networking 에 대해서는 네트워킹 Part 1: 세션 을 참고하시면 됩니다.
포트 관련 설정들
tcp_json_port: JSON 패킷을 주고 받을 서버의 TCP 포트 번호. 0 이면 비활성화입니다. (type=uint64, default=8012)
udp_json_port: JSON 패킷을 주고 받을 서버의 UDP 포트 번호. 0 이면 비활성화입니다. (type=uint64, default=0)
http_json_port: JSON 패킷을 주고 받을 서버의 HTTP 포트 번호. 0 이면 비활성화입니다. (type=uint64, default=8018)
websocket_json_port: JSON 패킷을 주고 받을 서버의 WebSocket 포트 번호. 0 이면 비활성화입니다. (type=uint64, default=0)
tcp_protobuf_port: Protobuf 패킷을 주고 받을 서버의 TCP 포트 번호. 0 이면 비활성화입니다. (type=uint64, default=0)
udp_protobuf_port: Protobuf 패킷을 주고 받을 서버의 UDP 포트 번호. 0 이면 비활성화입니다. (type=uint64, default=0)
http_protobuf_port: Protobuf 패킷을 주고 받을 서버의 HTTP 포트 번호. 0 이면 비활성화입니다. (type=uint64, default=0)
websocket_protobuf_port: Protobuf 패킷을 주고 받을 서버의 WebSocket 포트 번호. 0 이면 비활성화입니다. (type=uint64, default=0)
세션 관리 관련 설정들
session_timeout_in_second: 세션을 폐기하기 위해서 기다릴 초단위 유휴 시간. (type=uint64, default=300)
use_session_reliability: 세션 수준의 reliability 기능을 켬. 이는 세션을 다시 연결 할 때에도 패킷 손실이 발생하지 않는 것을 보장함. 자세한 내용은 세션의 메시지 전송 안정성 를 참고하세요. (type=bool, default=false)
use_sequence_number_validation: 만일 메시지의 시퀀스 번호가 잘못된 경우 메시지를 처리하지 않음. 이는 메시지 replay attack 을 막기 위함임. TCP 와 HTTP 에서만 동작함. 자세한 내용은 메시지 리플레이 공격 차단 를 참고하세요. (type=bool, default=false)
암호화 관련 설정들
암호화 관련해서 자세한 내용은 메시지 암호화 을 참고하세요.
use_encryption: 암호화 기능을 끄고 켬. (type=bool, default=false)
tcp_encryptions: 암호화 기능이 켜졌을 때, TCP 프로토콜에 적용될 암호화 방식들의 리스트.
빈값으로 설정하여 암호화 하지 않거나
ife1
,ife2
,chacha20
,aes128
중 하나 또는 모두 사용 가능함. 예)[]
또는["ife1", "ife2"]
,["chacha20"]
udp_encryptions: 암호화 기능이 켜졌을 때, UDP 프로토콜에 적용될 암호화 방식들의 리스트.
빈값으로 설정하여 암호화 하지 않거나
ife2
사용 가능. 예) [“ife2”]http_encryptions: 암호화 기능이 켜졌을 때, HTTP 프로토콜에 적용될 암호화 방식들의 리스트
빈값으로 설정하여 암호화 하지 않거나
ife2
사용 가능. 예) [“ife2”]encryption_ecdh_key: 암호화 기능이 켜졌을 때, AES 와 ChaCha20 의 세션 키 교환을 위해 사용되는 서버 측 비밀키
압축 관련된 설정들
압축 알고리즘은 기본 값이 "none"
이며, "zstd"
와 "deflate"
를 사용할 수 있습니다.
tcp_compression: TCP 프로토콜에 적용할 압축 알고리즘 type (type=string, default=”none”), dictionary (type=string, default=””), threshold (type=int32, default=128) 값 설정. (type=object)
"tcp_compression": { "type": "none", // TCP 에서 사용할 압축 알고리즘. "dictionary": "", // 클라이언트와 미리 공유한 사전 데이터 (zstd 전용). "threshold": 128 // 압축할 최소 메시지 크기.(Byte) 이보다 작은 메시지는 압축하지 않습니다. }
udp_compression: UDP 프로토콜에 적용할 압축 설정. 형식은 TCP 와 동일합니다.
http_compression: HTTP 프로토콜에 적용합니다.
websocket_compression: WebSocket 프로토콜에 적용합니다.
TCP 관련된 설정들
disable_tcp_nagle: TCP 세션을 사용할 때
TCP_NODELAY
소켓 옵션을 세팅함으로써 Nagle 알고리즘 을 끔. (type=bool, default=true)
디버깅 및 모니터링 관련된 설정들
enable_http_message_list: 이 옵션이 켜져 있으면, HTTP 를 사용해서
GET /v1/messages
을 할 때RegisterHandler()
함수로 등록된 message type 들을 볼 수 있게 해줍니다. 자세한 내용은 (고급) 아이펀 엔진의 네트워크 스택 의 HTTP 관련 내용을 참고하세요. 개발에 편리하지만 보안상 이유로 라이브 단계에서는 false 로 설정할 것을 권장합니다. (type=bool, default=true)session_message_logging_level: 세션 메시지 로그 레벨. 0 은 로그를 남기지 않음. 1 은 패킷 타입과 길이 정보만 남김. 2는 패킷의 내용까지 남김. (type=uint64, default=0)
Tip
2 로 세팅하면 개발과정 중에 주고 받는 메시지를 확인할 때 유용합니다. 단, 서버에 부하를 줄 수 있으므로 상용 서비스에서는 권장하지 않습니다.
session_message_logging_excluded: 세션 메시지 로그에서 제외할 메시지 타입들의 리스트.
메시지 타입은 문자열과 enum MessageType 형의 Protobuf 메시지 타입을 혼용해서 사용할 수 있습니다. 예)
[]
또는["login", "logout"]
,[17, 18]
,["login", 18]
enable_per_message_metering_in_counter: 카운터 기능 사용하기 를 통해서 클라이언트-서버간의 통신량에 대한 정보를 HTTP RESTful 로 제공합니다. 자세한 내용은 카운터 기능 사용하기 를 참고하세요. 개발에 편리하지만 서버에 상당한 과부하를 초래하기 때문에 false 로 설정할 것을 권장합니다. (type=bool, default=false)
json_protocol_schema_dir: 패킷 형식으로 JSON 을 사용할 때, JSON 패킷의 유효성을 검증할 스키마 파일이 들어있는 디렉토리 경로. 자세한 내용은 JSON 메시지 스키마 자동 검증 를 참고해주세요. (type=string, default=””)
tcp_ping: TCP 프로토콜에 적용할 핑의 sampling_interval_in_second (type=uint64, default=0), message_size_in_byte (type=uint64, default=32), timeout_in_second (type=uint64, default=0) 값 설정. (type=object)
"tcp_ping": { "sampling_interval_in_second": 0, // RTT 계산을 위한 ping 샘플링 인터벌을 초단위로 지정합니다. 0 은 동작을 끕니다. "message_size_in_byte": 32, // 전송할 ping 메시지 크기. "timeout_in_second": 0 // 지정된 시간 동안 Ping 응답이 오지 않을 경우 연결을 끊습니다. 0 은 동작을 끕니다. }
websocket_ping: WebSocket 프로토콜에 적용할 핑 설정. 형식은 TCP 와 동일합니다.
SSL/TLS 관련된 설정들
tcp_use_ssl: TCP 통신 시 SSL/TLS 사용 설정. (type=bool, default=false)
http_use_ssl: HTTP 통신 시 SSL/TLS 사용 설정. (type=bool, default=false)
websocket_use_ssl: Websocket 통신 시 SSL/TLS 사용 설정. (type=bool, default=false)
ssl_certification_path: SSL/TLS 인증서 파일의 경로. (type=string, default=””)
ssl_passphrase: SSL/TLS 비밀키의 암호. (type=string, default=””)
ssl_private_key_path: SSL/TLS 비밀키 파일의 경로. (type=string, default=””)
직접 설정을 바꿀 일이 거의 없는 설정들
close_transport_when_session_close: 세션을 닫을 때 딸려있는 Transport(연결)도 같이 종료함. (type=bool, default=true)
close_session_when_event_timeout: 이벤트 타임아웃 발생 시 연관된 세션을 자동으로 닫고, 세션 닫힘 핸들러가 호출되도록 합니다. 세션 닫힘 핸들러의 이벤트 태그는 Session ID 가 아닌 무작위 값이 할당됩니다. (type=bool, default=false)
send_session_id_as_string: 메시지 인코딩이 Protobuf 이면서 이 설정이 false 이면 세션 아이디를 바이너리 타입으로 전송하고, true 이면 문자열 타입으로 전송합니다. (type=bool, default=true)
Important
이 기능을 사용하기 위해서는 클라이언트 플러그인 버전이 다음 이상이여야 합니다.
Unity3D: 190
Unreal4: 35
Cocos2d-x: 35
send_session_id_only_once: 이 설정이 true 이면서 TCP 와 UDP 통신을 할 때, 세션 아이디를 첫 메시지에만 보내고 이후 메시지에서는 생략하여 메시지 크기를 작게 만들수 있습니다. (type=bool, default=false)
network_io_threads_size: 클라이언트-서버 패킷 처리를 담당할 쓰레드 개수. (type=uint64, default=4)
ssl_ciphers: SSL/TLS 통신에 사용하는 cipher 목록. (type=string, default=”ECDH+AESGCM:ECDH+AES256:ECDH+AES128:RSA+AESGCM:!aNULL:!eNULL:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED”)
Note
유니티 5, 2017, 2018 + .NET3.5 환경에서 SSL/TLS 통신을 하기 위해서는 TLS v1 을 사용해야 하고, 이를 위해 ssl_ciphers
에 AES128-SHA
, AES256-SHA
중 하나를 추가해야합니다.
하지만 TLS v1 은 보안 상의 이슈가 있으므로 SSL/TLS 통신을 사용해야 할 경우에는 유니티 2018 + .NET4, 2019 이상 버전을 사용하기를 권장합니다.
서버 관리 기능¶
ApiService¶
관리용 RESTful API 서버에 대응됩니다. 아이펀 엔진은 안전한 서버 관리를 위해서 클라이언트가 사용하는 HTTP 포트와 분리하여 별도의 포트에 관리용 API 서비스를 지원합니다.
api_service_port: 관리용 RESTful API 서비스를 돌리기 위한 로컬 TCP 포트 번호. (type=uint64, default=8015)
api_service_logging_level: 관리용 RESTful API 메시지들의 로그 레벨. 0 은 로그를 남기지 않음. 1은 에러인 경우만 남김. 2는 모든 요청에 대해 로그를 남김 (type=uint64, default=2)
직접 설정을 바꿀 일이 거의 없는 설정들
api_service_event_tags_size: 관리용 RESTful API 서비스를 동시에 돌리는 개수 (type=uint64, default=1)
CounterService¶
Server 내부의 각종 상태정보를 HTTP RESTful API 로 노출합니다. 자세한 내용은 카운터 기능 사용하기 를 참고해주세요.
counter_flush_interval_in_sec: 외부에 노출되는 counter 값을 주기적으로 갱신하는데, 이 시간 간격을 초단위로 지정 (type=uint64, default=0)
직접 설정을 바꿀 일이 거의 없는 설정들
counter_monitoring_interval_in_sec: 단순히 외부로 내보내는 것 외에 값들을 모니터링하는 초단위 시간 간격 (type=uint64, default=30)
warning_threshold_event_queue_length: 카운터 모니터링 시 이 값 이상으로 이벤트 큐가 길어지면 경고 메시지를 출력함 (type=uint64, default=3000)
warning_threshold_outstanding_fetch_query: 카운터 모니터링 시 이 값 이상으로 DB 읽기 큐가 길어지면 경고 메시지를 출력함 (type=uint64, default=5000)
warning_threshold_outstanding_update_query: 카운터 모니터링 시 이 값 이상으로 DB 쓰기 큐가 길어지면 경고 메시지를 출력함 (type=uint64, default=5000)
warning_threshold_slow_query_in_sec: 카운터 모니터링 시 DB 읽기 또는 쓰기에 소요되는 시간(단위: 초)이 기준 값보다 길어질 때 경고 메세지를 출력함(type=uint64, default=1)
warning_threshold_slow_distribution_in_sec: 카운터 모니터링 시 분산 처리에 사용되는 Zookeeper/Redis 처리 시간(단위: 초)이 기준 값보다 길어질 때 경고 메세지를 출력함(type=uint64, default=3)
HardwareInfo¶
게임 서버 코드에서 하드웨어 정보를 읽어올 때 도움을 주는 기능입니다.
external_ip_resolvers: 공인 IP 를 얻어내기 위한 방법들을 나열합니다. 콤마로 구분되어야 하며, 먼저 기술된 것이 높은 우선 순위를 갖습니다. 만일 현재 방법이 실패하면 다음 방법을 시도하게 됩니다.
NAT 설정의 경우는 공인 IP 를 수동으로 설정해야되며, 게임에 사용되는 프로토콜 별로 포트 번호 역시 기술할 수 있습니다. 기술할 수 있는 프로토콜 타입은
tcp+pbuf
,tcp+json
,udp+pbuf
,udp+json
,http+pbuf
,http+json
이 있습니다. 자세한 내용은 서버의 IP 주소 알아내기 를 참고해주세요. (type=string, default=”aws,nic:eth0,nat:192.0.2.113:tcp+pbuf=8012:http+json=8018”)discover_public_ip_from_aws_instance: 만일 게임 서버가 아마존 웹 서비스 (AWS) 상에서 동작한다면, 이 플래그는 AWS 의 http://169.254.169.254/latest/meta-data/public-ipv4 를 GET 함으로써 자신의 공인 IP 주소를 알아내게 함. (type=bool, default=false)
Logging¶
Logging 기능을 제어합니다. Logging 에 대한 자세한 내용은 게임 운영 Part 3: 플레이어 행동 로그 를 참고해주세요.
activity_log_output: 액티비티 로그 저장 경로. 다음의 값들이 가능합니다.
mongodb://user:passwd@host:port/database
mysql://user:passwd@host:port/database
json://path/to/file
file://path/to/file
syslog://name
stdout
glog
json 이나 file, glog 의 경우는 –log_root_dir 아래 상대 경로로 생성됩니다.
Syslog 는 Linux 에서만 동작합니다.
MongoDB의 경우 user, password, port 정보는 선택적인 정보이며, 레플리카 셋을 사용하기 위해서 콤마로 구분해서 호스트 여럿을 쓸 수도 있습니다. (예,
mongodb://user:passwd@host1,host2,user:passwd@host3
) (type=string, default=”glog”)activity_log_rotation_interval: 액티비티 로그를 로테이션할 초단위 시간 주기. (type=int32, default=60)
activity_log_write_schema: 액티비티 로그에 스키마 정보도 출력할지 여부. 만일 액티비티 로그 저장소로 mysql 을 쓰는 경우 mysql schema 를 자동설정할지 여부 (type=bool, default=true)
export_activity_log_schema: 액티비티 로그의 저장장소로 mysql 을 지정한 경우 액티비티 로그의 스키마 정보를 파일로 내보낼지 여부 (type=bool, default=false)
직접 설정을 바꿀 일이 거의 없는 설정들
glog_flush_interval: 구글 로깅을 플러쉬하기 위한 초단위 시간 주기. (type=int32, default=1)
glog_retention_period_in_days: 구글 로그 파일의 보관 기간. 보관 기간이 지난 glog 파일은 삭제됩니다. (type=int32, default=30)
MaintenanceService¶
게임 서버를 정기 점검 모드로 바꿀 수 있는 기능입니다.
under_maintenance: 정기점검 모드로 전환할지 여부 (type=bool, default=false)
maintenance_data_path: 정기 점검 정보를 담고 있는 JSON 파일. 이 파일의 내용이 클라이언트에게 전송됩니다. (type=string, default=””)
RuntimeConfiguration¶
MANIFEST.json 의 일부 내용을 서버가 동작 중에도 동적으로 오버라이드 할 수 있게 해주는 기능입니다.
enable_runtime_configuration: Run-time 에 아이펀 엔진 설정을 수정할 수 있게 할지를 지정 (type=bool, default=true)
SystemInfo¶
서버의 메모리 사용량, CPU 사용량 등 OS 정보를 CounterService 를 통해 외부로 노출해주는 기능입니다.
systeminfo_refresh_interval_in_sec: 시스템 정보 갱신을 위한 초단위 주기. (type=int32, default=5)
서버 측 임시 저장소¶
CrossServerStorage¶
서버간 데이터 공유를 지원하는 기능입니다. 자세한 내용은 분산처리 Part 2: 서버간 데이터 공유 를 참고해주세요.
enable_cross_server_storage: 해당 기능을 활성화시킬지 여부. redis-manifest 의
enable_redis
도 true 로 세팅해야됨.(type=bool, default=false)redis_tag_for_cross_server_storage: 서버간 데이터 공유를 위한 스토리지로 사용될 Redis 서버의 태그 값. (태그(Tag) 로 레디스 서버 구분 참조) (type=string, default=””)
Redis¶
아이펀 엔진은 Redis 와의 손쉬운 연동을 지원합니다. 이 기능은 Redis 와의 연결을 제어합니다. 자세한 내용은 DB 접근 Part 2: Redis 를 참고해주세요.
enable_redis: Redis 기능을 활성화 시킴. (type=bool, default=false)
redis_mode: 사용할 Redis mode.
redis
나sentinel
입력 가능 (type=string, default=”redis”)redis_servers:
redis_mode
가redis
일 때, Redis 서버들의 주소와 인증 비밀 번호를 입력함.예시
"redis_servers": { "": { "address": "127.0.0.1:6379", "auth_pass": "" } }
redis_sentinel_servers:
redis_mode
가sentinel
일 때, Redis senitnel 서버들의 주소와 인증 비밀 번호를 입력함.예시
"redis_sentinel_servers": { "": { "master_name": "mymaster", "addresses": ["127.0.0.1:26379"], "auth_pass": "" } }
직접 설정을 바꿀 일이 거의 없는 설정들
redis_async_threads_size: Redis 비동기 명령어를 처리하는데 사용될 쓰레드 숫자. (type=uint64, default=4)
인증과 빌링¶
AuthenticationService¶
아이펀 엔진은 Google 이나 AppStore 와 같은 서비스 플랫폼에 대한 인증 처리를 지원합니다.
Attention
구버전의 인증 방식인 iFun Authenticator 를 사용하기 위한 AuthenticationClient 설정은 더 이상 사용하지 않습니다.
use_authentication_service: true 이면, 외부 서비스의 인증 지원을 위한 엔진 기능을 활성화합니다. (type=bool, default=false)
BillingClient¶
인증과 유사하게 아이펀 엔진은 별도의 billing agent 를 제공합니다. (서비스 플랫폼 결제 검증 를 참고해주세요.) 이 기능은 그 agent 와의 통신을 설정합니다.
use_biller: iFun Biller agent 와의 통신을 활성화시킬지 여부. 만일
false
이면 모든 검증 과정을 bypass 하고 성공으로 간주함. (type=bool, default=false)remote_biller_ip_address: iFun Biller 가 돌고 있는 원격 호스트의 IP 주소. (type=string, default=”0.0.0.0”)
remote_biller_port: iFun Biller를 돌리고 있는 원격 호스트의 포트번호. (type=uint64, default=0)
빌링 처리별 추가로 필요한 설정들
use_googleplay_service_account: 구글 플레이 서비스 계정 사용 유무. (type=bool, default=false)
googleplay_service_account_json_path: 구글 플레이 서비스 계정 json 파일 경로. (type=string, default=””)
googleplay_refresh_token: 구글 플레이 리프레시 토큰. (자세한 내용은 구글 플레이 개발자 정보 참고). (type=string, default=””)
googleplay_client_id: 구글 플레이의 클라이언트 아이디. (자세한 내용은 구글 플레이 개발자 정보 참고). (type=string, default=””)
googleplay_client_secret: 구글 플레이의 클라이언트 시크릿. (자세한 내용은 구글 플레이 개발자 정보 참고). (type=string, default=””)
onestore_client_id: 원스토어의 클라이언트 아이디. (개발자 센터의 Apps - InApp정보 - 인증 및 라이선스 창에서 확인 가능). (type=string, default=””)
onestore_client_secret: 원스토어의 클라이언트 시크릿. (개발자 센터의 Apps - InApp정보 - 인증 및 라이선스 창에서 확인 가능). (type=string, default=””)
게임 내 소셜 기능¶
LeaderboardClient¶
인증과 유사하게 아이펀 엔진은 별도의 leaderboard agent를 제공합니다. (콘텐츠 지원 Part 1: 리더보드(랭킹) 를 참고해주세요.) 이 기능은 그 agent 와의 통신을 설정합니다.
use_leaderboard: iFun Leaderboard agent 와의 통신을 활성화시킬지 여부. false 로 지정할 경우 모든 랭킹 관련된 요청을 dummy 값으로 응답하는 테스트모드로 작동함. (type=bool, default=false)
leaderboard_agents: 접속하려는 리더보드 에이전트들의 연결 정보를 다음과 같은 format 으로 입력함.
"leaderboard_agents": { // iFun Leaderboard agent를 tag 로 구분해서 각각의 접속 정보를 입력합니다. "<tag>": { // iFun Leaderboard 의 MANIFEST.json 에 기술된 server_tcp_port 를 입력합니다. "address": "127.0.0.1:12820" }, ... }
MatchmakingServer¶
매치 메이킹 서버 기능을 담당합니다. 매치 메이킹 서버는 게임 서버와 별도로 존재할 수도 있고, 게임 서버 내에 같이 포함되어 동작할 수도 있습니다. 가령 이 MatchMakingServer
기능를 게임 서버의 MANIFEST.json
에 포함시키면 게임 서버 자체가 매치 메이킹 서버 기능을 포함해서 동작합니다. 만일 이 기능만 들어있는 별도의 서버를 만들면 별도로 동작합니다. 자세한 내용은 콘텐츠 지원 Part 2: 매치메이킹 을 참고해주세요.
enable_dynamic_match: 완결되지 않은 매치들끼리 합병해서 매치를 더 빨리 만들어낼지 여부 (type=bool, default=true)
enable_match_progress_callback: 매치메이킹이 진행되는 동안 진행 상황 알림을 받을지 여부. 만일 이 값이 true 이면
MatchmakingClient::StartMatchmaking()
에 넘겨진progress_cb
가 주기적으로 호출되게 됨. (type=bool, default=false)
직접 설정을 바꿀 일이 거의 없는 설정들
concurrent_number_of_players_threshold: 매치 메이킹 서버가 동시에 처리할 수 있는 플레이어 수 지정. 내부 메모리 구조 할당을 위해서 설정이 필요. (type=int64, default=3000)
분산 처리 및 서버 확장¶
AccountManager¶
플레이어의 로그인, 로그아웃, 서버간 이동 등의 기능을 담당합니다. 이 기능은 서버가 여러대 있는 분산 환경에서도 동작합니다.
redirection_strict_check_server_id: 클라이언트가 다른 서버로 이동해서 연결하는 경우 서버 ID 체크를 함. (type=bool, default=true)
redirection_secret: 클라이언트가 다른 서버로 이동해서 연결하는 경우 검증하기 위한 비밀 키 (type=string)
MulticastServer¶
멀티캐스팅과 채팅 기능을 제어합니다.
transport_for_multicast_channel: 멀티캐스트 시 사용할 Transport(연결)을 지정 합니다. tcp와 websocket 중 선택할 수 있습니다. (type=string, default=”tcp”)
max_member_count_per_channel: 채널 당 유저 정원을 지정합니다. 0 이면 무제한으로 지정됩니다. 0 이 아닌 경우 2 이상 부터 지정 가능합니다. (type=uint64, default=0)
RpcService¶
서버간 통신을 제어합니다.
rpc_enabled: RPC 기능과 이 기능에 의존하는 다른 기능들을 사용하도록 설정합니다. (type=bool, default=false)
rpc_threads_size: RPC 기능을 담당하는 쓰레드 개수를 설정합니다. (type=uint64, default=4)
rpc_port: RPC 서비스에 이용할 TCP 포트 번호를 설정합니다.
하나의 호스트에 여러 서버를 실행하는 경우 중복되지 않도록 설정해야 합니다. (type=uint64, default=8015)
rpc_nic_name: RPC 통신에 사용할 네트워크 인터페이스 이름을 설정합니다.
보안상의 이유와 클라우드 외부 네트워크 사용량 감소를 위해 내부망에 연결되는 네트워크 인터페이스를 선택할 것을 권장합니다. (type=string, default=””)
rpc_use_public_address: 호스트가 가상 IP 를 사용하는 NAT 환경에서 외부 네트워크의 서버와 RPC 그룹으로 연결해야 하는 경우 이 항목을 true 로 설정하면 RPC 연결 시 Public IP 를 사용하도록 동작합니다. (type=bool, default=false)
rpc_tags: RPC 그룹에서 특정 태그 그룹에 속하도록 설정합니다. 이를 활용해서 서버 코드에서 특정 태그를 가진 서버들을 뷴류할 수 있습니다.
예시: 아래처럼 지정할 경우 코드에서
dungeon_server
태그를 가진 서버 리스트나, level:1-5 태그를 가진 서버만 뽑아올 수 있음."rpc_tags": [ "dungeon_server", "level:1-5" ]
rpc_message_logging_level: RPC 기능에 대한 메시지들의 로그 레벨을 설정합니다. (type=uint64, default=0)
rpc_disable_tcp_nagle: TCP 세션을 사용할 때 TCP_NODELAY 소켓 옵션을 설정해서 Nagle 알고리즘을 사용하지 않도록 합니다. (type=bool, default=true)
rpc_check_connection: RPC Peer 들과의 연결 상태를 확인하기 위해 일정 주기로 빈 RPC 요청을 보내고 오랫동안 응답이 안 올 경우 비정상 상태로 판단하여 연결을 끊습니다. 네트워크 장애 상황을 대비해 사용할 수 있습니다.
enable_rpc_reply_checker: true 이면 5초 이내 RPC 응답을 받지 못할 경우 경고 메시지를 출력함. (type=bool, default=true)
rpc_backend: RPC 기능의 백엔드로 사용할 코디네이션 서비스를 선택합니다. (type=string, default=””)
Redis (권장): 이어서 설명하는 rpc_redis_hosts 및 관련 설정들에 따라 동작합니다.
Zookeeper: ZookeeperClient 항목의 설정에 따라 동작합니다.
rpc_backend_zookeeper: (주의) ‘rpc_backend’ 를 사용하시기 바랍니다.
RPC 기능의 백엔드로 Zookeeper 를 사용하도록 설정합니다.
true 일 경우, 이어서 설명하는 ZookeeperClient 항목이 올바르게 설정되어 있어야 정상 동작합니다.
false 일 경우 Redis 를 사용하며 다음 설정 항목들을 설정해야 합니다. (type=bool, default=true)
Warning
아이펀 엔진 1.0.0-4953 Experimental 부터 프로젝트 생성 시에 MANIFEST.json 내용에서 rpc_backend_zookeeper 설정이 삭제되고, rpc_backend 항목으로 변경됩니다. 기존에 생성한 프로젝트에서는 rpc_backend_zookeeper 항목을 계속해서 사용하실 수 있지만 향 후 삭제될 수 있기 때문에 rpc_backend 항목으로 변경 해 주시기 바랍니다. rpc_backend 설정이 “” 일 때만 rpc_backend_zookeeper 설정이 유효하며, 두 항목이 동시에 설정되어 있는 경우 rpc_backend 설정이 적용됩니다.
아래 설정들은 rpc_backend 항목이 Redis 이거나 rpc_backend_zookeeper 설정이 false 일 때에만 유효합니다.
rpc_redis_use_sentinel: Redis Sentinel 을 사용할 경우 true 로 설정합니다. (type=bool, default=false)
rpc_redis_hosts: RPC 정보를 저장할 Redis 서버 주소들을 설정합니다. Redis 서버 가 Sentinel 구성 일 경우는 rpc_redis_sentinels 설정을 사용합니다.
Important
하나의 RPC 그룹으로 묶이는 서버들은 RPC 백엔드 호스트 주소를 포함하여 동일한 설정을 가지고 있어야 합니다.
예시: RPC 백엔드 서버를 여러 개 설정하면 데이터를 분산시킬 수 있습니다.
"rpc_redis_hosts": [ { "host": "127.0.0.1:6379", "database": 0, // 생략하면 기본값인 0으로 동작합니다. "auth": "" // 생략하거나 빈 문자열을 입력하면 인증을 생략합니다. }, { "host": "127.0.0.1:6379", "database": 1, "auth": "" } ]
에시: RPC 백엔드 서버가 Sentinel 구성일 때는 다음과 같이 설정합니다.
"rpc_redis_sentinels": [ {"master_name": "...", "addresses": "...", "database": index, "auth": ""}, {"master_name": "...", "addresses": "...", "database": index, "auth": ""}, ]
rpc_redis_connection_count: RPC 백엔드 서버 하나 당 연결 개수를 설정합니다. (type=uint64, default=16)
rpc_redis_master_update_interval_in_seconds: RPC 기능으로 묶이는 서버들 끼리 마스터 서버를 선정하기 위한 주기를 설정합니다. 각 서버들은 이 주기마다 한 번씩 마스터 선정을 위해서 레디스 서버와 통신합니다. (type=uint64, default=5)
rpc_redis_session_timeout_in_seconds: 레디스 서버와 연결을 유지하는 제한시간입니다. 이 설정보다 긴 시간동안 레디스 서버와 연결이 되지 않을 경우 서버가 종료될 수 있습니다. (type=uint64, default=10)
rpc_redis_recovery_windows_size_in_sec: 레디스 서버가 크래시하는 등의 이유로 연결이 끊기게 되면 서버가 요청한 레디스 명령이 반영되어 있지 않는 경우가 있습니다. 이 때, 복원에 사용하기 위한 데이터를 보관하는 시간을 설정합니다. 예를 들어 기본값인 경우 최근 6초 동안의 레디스 명령을 보관했다가 레디스 서버와 연결이 다시 맺어지는 상황이 발생하면 보관했던 데이터들이 서버에 반영되어 있는지 확인합니다. 단, 설정한 시간보다 긴 시간동안 연결이 끊긴 상태가 유지될 경우 데이터 유실이 발생 할 수 있습니다. (type=uint64, default=6)
Important
RPC Backend 로 사용되는 Redis Server 는 전용으로 사용하고 Persistence 기능을 끄는 것을 권장합니다.
ZookeeperClient¶
아이펀 엔진이 서버간 통신을 위해 Zookeeper 를 사용할 때 Zookeeper 와의 연결을 제어합니다.
zookeeper_nodes: Zookeeper 서버 리스트들. 콤마로 구분된 ‘아이피:포트’ 형태의 리스트. (type=string, default=”localhost:2181”)
zookeeper_client_count: Zookeeper 에 한번에 몇개의 연결을 맺을지 지정. (type=uint64, default=4)
zookeeper_session_timeout_in_second: Zookeeper 세션 타임아웃 시간. (type=uint64, default=60)
zookeeper_log_level: Zookeeper 라이브러리의 로그 레벨. (type=uint64, default=1)
클라이언트 지원¶
AppInfo¶
현재 버전이나 허용되는 과거 버전 등을 관리할 수 있고, 패치가 필요한 경우 URL 등을 기술할 수 있습니다. 또한 인증이나 billing 은 어떻게 처리해야되는지도 지정할 수 있습니다.
클라이언트 버전 관련 설정들
client_current_version: 현재 게임 클라이언트 버전. (type=string, default=”000”)
client_compatible_versions: 최신 버전은 아니지만, 접속 가능한 클라이언트 버전 리스트
예시
"client_compatible_versions": ["0.1", "0.2"]
client_update_info: 클라이언트 업데이트 정보. (type=string, default=””)
client_update_uri: 업데이트된 클라이언트를 받아올 수 있는 URI. (대개 앱 장터) (type=string, default=””)
인증 방식에 대한 설정들
app_auth_service_provider: 클라이언트 인증을 처리하는 방식을 지정합니다. 이에 따라 AuthenticationService 가 동작합니다. (type=string, default=””)
app_id: 인증을 처리하는 쪽에서 인식할 수 있는 애플리케이션 ID 입니다. 예를 들어 앱 장터에서 애플리케이션 ID 등이 됩니다. (type=string, default=””)
app_password: 인증 처리를 위해서는 애플리케이션 ID 외에도 그에 따른 비밀 번호를 같이 입력해야될 수도 있습니다. 이 설정은 그 비밀 번호를 지정합니다. (type=string, default=””)
ClientResourceService¶
클라이언트의 리소스 데이터가 최신인지 확인하거나 패치 URL 을 전송해주는 등의 도움을 주는 기능입니다. 자세한 내용은 클라이언트 지원 Part 2: 클라 리소스 를 참고해주세요.
use_client_resource_service: 기능을 활성화 시킬지 여부 (type=bool, default=false)
client_resource_service_port: 클라이언트 리소스 서비스가 바인딩할 HTTP 포트. (type=uint64, default=0)
client_resource_dir: Client 가 다운로드 받을 리소스를 저장하는 디렉토리 경로. (type=string, default=””)
client_resource_url_base: 클라이언트 리소스를 받기 위한 베이스 URL (예, CDN 베이스 경로) 만일 이것이 세팅되면, 클라이언트 리소스 서비스는 파일 리스트만 클라이언트에게 전송하고 실제 파일은 해당 베이스 URL 에서 받게 redirect 한다. (type=string, default=””)
client_resource_list_url: 클라이언트 리소스들의 리스트를 담고 있는 파일의 URL. 만일 이 값이 설정되어있으면,
client_resource_dir
은 무시됨. (type=string, default=””)client_resource_max_file_size: 한 클라이언트 리소스 파일의 최대 사이즈. 바이트 단위. (type=uint64, default=10485760)
직접 설정을 바꿀 일이 거의 없는 설정들
client_resource_service_threads_size: 클라이언트 리소스 서비스에 할당된 쓰레드 개수. (type=uint64, default=2)
게임 콘텐츠 구현¶
ResourceManager¶
게임 서버에 기획 데이터를 읽어들이는데 도움이 되는 기능입니다. 자세한 내용은 콘텐츠 지원 Part 4: 기획 데이터 를 참고해주세요.
game_json_data_dir: JSON 형태로 된 게임 기획 데이터가 있는 디렉토리 경로. (type=string, default=””)
enable_game_data_mysql: 게임 기획 데이터를 MySQL 에서 읽을지 여부. (type=bool, default=false)
game_data_mysql_server: 게임 기획 데이터를 담고 있는 MySQL 서버 연결 정보. (type=string, default=”localhost:3306”)
game_data_mysql_username: 게임 기획데이터를 담고 있는 MySQL 서버의 유저명. (type=string, default=”funapi”)
game_data_mysql_password: 게임 기획데이터를 담고 있는 MySQL 서버의 비밀번호. (type=string, default=”funapi”)
game_data_mysql_database: 게임 기획 데이터를 담고 있는 MySQL 데이터베이스 이름. (type=string, default=”game_data”)
game_data_mysql_character_set: 게임 기획 데이터 DB 와의 연결에 사용될 character set (type=string, default=”utf8”)
game_data_mysql_tables: 게임 기획데이터에 해당되는 MySQL 테이블들 이름. 콤마로 구분됨. (type=string)
기타¶
아래 기능들은 설정 파라미터 없이 유무 만으로 동작이 결정되는 기능 혹은 굉장히 저수준의 기능라 일반적으로 다룰 일이 없는 기능들입니다.
Curl¶
아이펀 엔진에 내장되어있는 HTTP 클라이언트에 대응하는 기능입니다.
curl_threads_size: CURL 에 할당된 쓰레드 개수 (type=int64, default=1)
HttpClientPool¶
대량의 HTTP 요청을 보내기 위한 기능입니다.
http_client_pool_max_recycle_interval_in_sec: 희망하는 최대 재사용 대기시간입니다. HttpClient 가 사용된 후 다시 사용되기까지의 시간이 이 시간 보다 길면 HttpClient 를 줄여 효율을 높입니다.(type=uint64, default=3)
RandomGenerator¶
Random 숫자를 생성하기 위한 component 입니다.
Timer¶
게임 프로그래머가 사용할 수 있는 Timer 입니다. 게임 내 Tick 처럼 주기적으로 처리되어야 하는 작업들은 Timer 의 핸들러 안에서 처리하면 됩니다.
WallClock¶
아이펀 엔진은 시간 동기화로 인해 시계가 뒤로 돌아가는 것을 방지하기 위해서 monotonic clock 을 사용합니다. 하지만 monotonic clock 은 사람이 읽는 것이 어렵기 때문에, 이를 위해 WallClock 도 제공합니다.