如何解决Spring 应用 300 TPS 瓶颈
我有一个在 Spring 上运行的 Java 应用程序,它有一个创建发票的服务,每个发票有 10 次读取和写入。但是我们无法让它通过 150TPS(每秒事务数),硬件没有达到 30% 的容量,我们将 maxpool 大小设置为 300,DB 设置为 3000 I/O,我们没有看到任何改进,我不确定它的代码或配置
public class InvoiceHomeService {
private final Logger log = LoggerFactory.getLogger(InvoiceHomeService.class);
private final DosageService dosageService;
private final DosageRepository dosageRepository;
private final InvoiceService invoiceService;
private final ApplicationProperties applicationProperties;
public Invoice create(Company company,CreateInvoiceHomeRequest request,Branch branch,EconomicActivity economicActivity,String modalityId) throws DosageNotAvailableException,DateOutRangeException {
Sorter invoiceType = new Sorter(SortersConstants.HOME);
DosageTransaction dosageTransaction = getDosageTransaction(request,company,economicActivity,invoiceType,modalityId);
Invoice invoice = new Invoice();
/* Critital information */
invoice.setExternalId(request.getId());
invoice.setInvoiceType(invoiceType);
invoice.setInvoiceMethod(new Sorter(SortersConstants.IM_VIRTUAL));
invoice.setTotalAnticipatedPayment(BigDecimal.ZERO);
/* Basic information */
invoice.setContractId(request.getContractId());
// invoice.setCustomerId(request.getCustomerId());
invoice.setBillingPeriod(request.getBillingPeriod());
invoice.setVoucherNumber(request.getVoucherNumber());
invoice.setVoucherType(request.getVoucherType());
// invoice.setVoucherSerial(request.getVoucherSerial());
invoice.setVoucherState(request.getVoucherState());
invoice.setPaymentType(request.getTypeOfPayment());
invoice.setEmailNotification(request.getEmailNotification());
invoice.setPhoneNumberNotification(request.getPhoneNumberNotification());
invoice.setIsTigo(request.getIsTigo());
invoice.setPersonType(request.getTypeOfPerson());
/* Extras information */
// invoice.setExtraPhoneLine(request.getExtraPhoneLine());
// invoice.setExtraPlan(request.getExtraPlan());
invoice.setExtraCustomerAddress(request.getExtraCustomerAddress());
invoice.setExtraPeriodStartdate(request.getExtraPeriodStartdate());
invoice.setExtraPeriodEnddate(request.getExtraPeriodEnddate());
invoice.setExtraPaydayLimit(request.getExtraPaymentDeadline());
invoice.setExtraServiceInterruptionDate(request.getExtraServiceInterruptionDate());
invoice.setExtraPeriodDays(request.getExtraPeriodDays());
/* Customer information */
invoice.setNitCustomer(request.getNitCustomer());
invoice.setSocialReason(request.getSocialReason());
/* Invoice template */
invoice.setInvoiceTemplate(JasperSingleton.INVOICE_TEMPLATE_HOME_VERSION);
Set<InvoiceDetails> details = new HashSet<>();
for (CreateInvoiceDetailsHomeRequest detail : request.getDetails()) {
InvoiceDetails item = new InvoiceDetails();
item.setQuantity(detail.getQuantity());
item.setConcept(detail.getConcept());
item.setUnitPrice(detail.getUnitPrice());
item.setSequence(detail.getSequence());
item.setSubtotal(detail.getSubtotal());
item.setExtraPeriod(detail.getExtraPeriod());
details.add(item);
}
invoice.setDetails(details);
invoice = invoiceService.createInvoice(
invoice,dosageTransaction.getDosage(),branch,dosageTransaction.getSequence(),request.getEmissionDate(),request.getTotalAmount(),economicActivity.getType()
);
return invoice;
}
public synchronized DosageTransaction getDosageTransaction(CreateInvoiceHomeRequest request,Company company,Sorter invoiceType,DateOutRangeException {
Optional<Dosage> optionalDosage = dosageService.getDosageActive(company.getId(),invoiceType.getSequence(),economicActivity.getId(),SortersConstants.DT_CYCLE,modalityId,invoiceType.getId());
if (!optionalDosage.isPresent()) throw new DosageNotAvailableException();
Dosage dosage = optionalDosage.get();
if (!request.getEmissionDate().isAfter(dosage.getStartDate().minusDays(1)) ||
!request.getEmissionDate().isBefore(dosage.getDeadlineDate().plusDays(1))) throw new DateOutRangeException();
if (modalityId.equalsIgnoreCase(SortersConstants.DM_CICLICAL) && dosage.getSequence() > applicationProperties.getDosageConfig().getMaxInvoicePerDosage().longValue()) {
dosage.setState(new Sorter(SortersConstants.DS_LOCKED));
dosage = dosageRepository.save(dosage);
log.info("Change state dosage: {},state: {}",dosage.getId(),dosage.getState().getId());
return getDosageTransaction(request,modalityId);
}
Long sequence = invoiceService.getSequenceDosageSync(dosage.getId());
return new DosageTransaction(dosage,sequence);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。