feat: add retry when requesting ocr service

This commit is contained in:
debugtalk
2022-10-17 11:47:20 +08:00
parent 3ccdb00fc2
commit 7579c10cb7
2 changed files with 29 additions and 12 deletions

View File

@@ -45,7 +45,7 @@ func (s *veDEMOCRService) getOCRResult(imageBuf []byte) ([]OCRResult, error) {
if err != nil {
return nil, fmt.Errorf("create form file error: %v", err)
}
_, err = formWriter.Write(imageBuf)
size, err := formWriter.Write(imageBuf)
if err != nil {
return nil, fmt.Errorf("write form error: %v", err)
}
@@ -55,8 +55,9 @@ func (s *veDEMOCRService) getOCRResult(imageBuf []byte) ([]OCRResult, error) {
return nil, fmt.Errorf("close body writer error: %v", err)
}
if env.VEDEM_OCR_URL == "" {
log.Error().Msg("VEDEM_OCR_URL env missed for OCR service")
if env.VEDEM_OCR_URL == "" || env.VEDEM_OCR_AK == "" || env.VEDEM_OCR_SK == "" {
log.Error().Msg(
"missed env missed for veDEM OCR service: VEDEM_OCR_URL/VEDEM_OCR_AK/VEDEM_OCR_SK")
os.Exit(1)
}
@@ -69,14 +70,25 @@ func (s *veDEMOCRService) getOCRResult(imageBuf []byte) ([]OCRResult, error) {
req.Header.Add("Agw-Auth", token)
req.Header.Add("Content-Type", bodyWriter.FormDataContentType())
resp, err := client.Do(req)
if err != nil {
var logID string
if resp != nil {
logID = getLogID(resp.Header)
var resp *http.Response
// retry 3 times
for i := 1; i <= 3; i++ {
resp, err = client.Do(req)
if err == nil {
break
}
return nil, fmt.Errorf("http reqeust veDEM OCR server error: %v, logID: %s", err, logID)
logID := getLogID(resp.Header)
log.Error().Err(err).
Str("logID", logID).
Int("imageBufSize", size).
Msgf("request OCR service failed, retry %d", i)
time.Sleep(1 * time.Second)
}
if resp == nil {
return nil, fmt.Errorf("veDEM OCR service is not available")
}
defer resp.Body.Close()
results, err := ioutil.ReadAll(resp.Body)

View File

@@ -243,7 +243,8 @@ def sort_dict_by_custom_order(raw_dict: Dict, custom_order: List):
class ExtendJSONEncoder(json.JSONEncoder):
"""especially used to safely dump json data with python object, such as MultipartEncoder"""
"""especially used to safely dump json data with python object,
such as MultipartEncoder"""
def default(self, obj):
try:
@@ -275,7 +276,8 @@ def is_support_multiprocessing() -> bool:
Queue()
return True
except (ImportError, OSError):
# system that does not support semaphores(dependency of multiprocessing), like Android termux
# system that does not support semaphores
# (dependency of multiprocessing), like Android termux
return False
@@ -320,7 +322,10 @@ def gen_cartesian_product(*args: List[Dict]) -> List[Dict]:
return product_list
LOGGER_FORMAT = "<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | <level>{level}</level> | <level>{message}</level>"
LOGGER_FORMAT = (
"<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green>"
+ " | <level>{level}</level> | <level>{message}</level>"
)
def init_logger(level: str):