[개발자 노트] Odin

5111 단어 Norn

하나의 큰 계획의 작은 모듈: Odin
Github 주소:https://github.com/chkinglee/Odin
2020-05-29
프로젝트 구상
명명 출처
Odin, 신들의 아버지.
의 목적
0에서springboot 프로젝트를 구축하고 mysql,redis,elasticsearch를 통합하여 학습 데모로 삼는다
배경.
많은 서비스들이elasticsearch에 의존하는 수요가 있을 수 있다. 예를 들어 사이트 내 편지, 글, 글 평론, 백과 문서, 작업표 등이다.'많은 서비스'를'업무자'로 간주하면 모든 업무가 자체적으로elasticsearch에 대한 기능을 개발하면 코드 개발과 유지보수 비용이 높아진다.서비스 개발을 고려하여 elasticsearch에 대한 사용에 전념할 수 있습니다.
요구 사항
업무 측과 업무 기능에 따라 업무 측이 규정한 색인과 유형을 판단하고 업무 측이elasticsearch에 대한 읽기와 쓰기 요청을 처리할 수 있다
디자인 사고방식
1. 데이터베이스에 업무자 tenant, 업무 기능 모듈, 대응하는 색인 이름 indexName, 대응하는 유형 이름 typeName을 기록한다.
2. 업무 측이 문서를 읽기와 쓰기를 요청할 때 tenant,module, 사용자 정의docId, 문서 내용의 jsonstr를 휴대해야 한다.
3. odin은 tenant,module에 따라 데이터베이스를 조회하고 대응하는 indexName과 typeName을 찾아elasticsearch에 읽기와 쓰기를 요청한다.
4. 성능 향상을 고려하여 데이터베이스에 있는 정보를 Redis에 캐시하고, odin이 읽기와 쓰기 요청을 처리할 때 Redis를 먼저 확인한다.
변증법
Q:elasticsearch에 의존하는 업무 모듈은 모델을 직접 디자인하고doc내용을 조직하며odin이 되돌아오는 내용을 해석해야 하기 때문에 단독으로odin을 쓰면 곤란해 보인다.
A:네, 현재odin에 대한 구상은 가장 간단한 데모 통합 mysql,redis,elasticsearch를 어떻게 쓰는가에 머물러 있고 후기에 진정한 응용을 할 수 있습니다.각 업무 모듈은 elasticsearch에 대한 입력을 작성하고 elasticsearch의 출력을 처리하는 것을 피할 수 없다.odin은 하나의 도구 클래스와 같다. 단지 같은 대형 시스템의 개발자에게는 elasticsearch를 어떻게 요청하는지 지나치게 고려할 필요가 없고, 같은 도구 클래스와 다른 관련 코드를 반복해서 복사하고 붙일 필요가 없다.나중에 가능하면 공공 창고로 봉인하는 것도 고려할 거예요.odin의 현재 생각은 elasticsearch에 대한 응용에 전념하는 것이다. 
2020-05-30
데이터베이스 디자인
데이터베이스 응용
1. 저장 업무 이름tenant, 업무 모듈 모듈module, 인덱스 index, 유형 type.상위 업무 측이 문서를 읽고 쓸 때, 업무 이름과 업무 모듈에 따라 목표 인덱스의 유형을 가져옵니다.
테이블 구조 및 데이터 예
CREATE TABLE `tenant` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `tenant` varchar(64) DEFAULT NULL COMMENT '   ',
  `module` varchar(64) DEFAULT NULL COMMENT '    ',
  `indexName` varchar(64) DEFAULT NULL COMMENT '  ',
  `typeName` varchar(64) DEFAULT NULL COMMENT '  ',
  `description` varchar(64) DEFAULT NULL COMMENT '      ',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8


mysql> select * from tenant ;
+----+----------+-------------+---------------------+-------------+-----------------------+
| id | tenant   | module      | indexName           | typeName    | description           |
+----+----------+-------------+---------------------+-------------+-----------------------+
|  1 | mt       | article     | mt_article          | article     | NULL                  |
|  2 | hogwarts | mail        | hogwarts_mail       | mail        |                |
|  3 | hogwarts | application | hgwarts_application | application |                |
+----+----------+-------------+---------------------+-------------+-----------------------+
3 rows in set (0.00 sec)

핵심 논리 설계
Q:elasticsearch를 어떻게 응용합니까?
A:통속적인 방식은 도모의'스프링북 통합elasticsearch'입니다.그러나 현재 관련 자료를 한 편 뒤적여 재삼 고려한 결과 엘라스틱 검색에 대한 공식 의존을 통합하지 않고 httpclient 도구 종류를 찾아냈다. 엘라스틱 검색을 하나의 서비스로 삼았을 뿐이고doc에 대한 읽기와 쓰기는 사실 엘라스틱 검색에 대한 http 요청일 뿐이다.주로 관련 자료 중의 demo는 대부분이 구체적인 업무를 대상으로 하는 것이고odin의 디자인 목적은 구체적인 업무를 대상으로 하는 것이 아니라 유니버설 업무를 대상으로 하는 것이다.나중에 봐요.
디자인 사고방식
쓰기 요청
1. 업스트림 요청 형식: POST/{tenant}/{module}/{id}, RequestBody는es에 쓸 jsonString입니다
2. tenant와module 조회 데이터베이스(jpa 사용)에 따라 indexName 및 typeName 획득
3. elasticsearch의 URL을 연결하고 http 요청을 발동합니다
테스트
GET http://127.0.0.1:8803/api/v1/tenant/hogwarts/mail
{
    "code": 0,
    "message": "success",
    "detail": [
        {
            "id": 2,
            "tenant": "hogwarts",
            "module": "mail",
            "indexName": "hogwarts_mail",
            "typeName": "mail"
        }
    ]
}

참고 자료
springboot 통합 mysql
springboot 통합 jpa
https://segmentfault.com/a/1190000014269284?utm_source=index-hottest
https://www.jianshu.com/p/2aa3d2dd83bd
2020-05-31
통합 Redis
redis 응용 프로그램
1. tenant의 구체적인 내용을 저장하고 모든 doc에 대한 읽기와 쓰기 요청은 매번 데이터베이스 조회가 성능에 심각한 영향을 미친다
2,string을 사용하면 키의 형식은 ODIN:TENANT:${tenant}:${module}이고value는 데이터베이스에 있는 tenant 기록을 jsonString으로 포맷합니다
테스트
로그를 보면 조회 데이터베이스는 14-20ms 정도, 조회 리디스는 1-3ms 정도 소모되어 평균 8배의 성능을 향상시켰다.(mysql와redis 모두odin과 같은 기기로 배치)
참고 자료
springboot는 redis를 통합하고 redisTemplate를 사용합니다.
https://www.cnblogs.com/jingjiren/p/12704401.html
https://www.jianshu.com/p/c168e2b825cb
 
통합elasticsearch
인덱스, 유형, 매핑
일asticsearch의 자동 생성에 의존하여 추가
테스트
Request
POST /api/v1/docs/hogwarts/mail/202005310511499702 HTTP/1.1  
Host: 127.0.0.1:8803  
Content-Type: application/json  
  
{  
    "id":"202005310511499702",  
    "createTime": "2020-05-31T05:11:49Z",  
    "sender":"chkinglee",  
    "receiver":"lilinzhen9702",  
    "content":"           "  
}  
  
Response  
{
    "code": 0,
    "message": "success",
    "detail": true
}

참고 자료
https://www.iteye.com/blog/lxy19791111-341409

좋은 웹페이지 즐겨찾기