發(fā)布于:2021-01-07 17:22:45
0
1680
0
ActiveJ是一個全新的開發(fā)平臺,可通過輕量級且可本地伸縮的異步體系結(jié)構(gòu)創(chuàng)建各種復(fù)雜程度的現(xiàn)代應(yīng)用程序,從而從硬件中擠出最后的性能。讓我們概述框架的核心組件!
什么是ActiveJ?
ActiveJ是全新的全棧Java框架,可用于各種Web,云和微服務(wù)高負(fù)載場景。
ActiveJ是本機(jī)高性能解決方案。根據(jù)ActiveJ網(wǎng)站的說法,它最初是為RTB廣告平臺的解決方案重新開發(fā)的,該平臺每天處理超過1000億個入站請求。
為了滿足這個想法,ActiveJ不僅效率極高,而且還提供了另一種開發(fā)方法。它具有最少的第三方依賴關(guān)系,可實現(xiàn)高性能,一致性和簡化的開發(fā)流程。ActiveJ使應(yīng)用程序業(yè)務(wù)邏輯超出了框架規(guī)范和限制。
讓我們概述框架的核心組件!
ActiveJ組件
ActiveJ具有一組松散耦合的組件,這些組件涵蓋了整個應(yīng)用程序堆棧。有些組件沒有依賴性,可以用作獨立庫。
異步核心
ActiveJ具有自己的高性能異步I / O核心:Eventloop,Promise和Net。它還具有異步數(shù)據(jù)流處理功能:CSP和Datastream。
主動注入
快速輕量的依賴注入庫。它是多線程友好的,功能豐富的,并且具有閃電般的快速啟動時間和運(yùn)行時間。它提供了對嵌套作用域,單例和臨時綁定,模塊,程序化綁定生成,依賴關(guān)系圖的自省,轉(zhuǎn)換,丟失綁定的自動生成以及對現(xiàn)有綁定的修改的支持。它沒有第三方依賴性,可以獨立于ActiveJ平臺使用。您可以在ActiveInject的網(wǎng)站上找到其用法的一些示例。
ActiveJ HTTP
高性能異步HTTP客戶端和服務(wù)器。根據(jù)基準(zhǔn)測試,在某些使用情況下,即使在單核上并且總CPU負(fù)載也要少50%,它比多線程Vert.x HTTP服務(wù)器快15%。帶有嵌入式HTTP服務(wù)器的最小ActiveJ Web應(yīng)用程序的總大小僅為1.4MB,啟動時間僅為0.65秒,而Spring為17MB和14秒。
讓我們使用HTTP組件創(chuàng)建一個簡單的服務(wù)器。它具有預(yù)定義的HTTP客戶端和服務(wù)器實現(xiàn),并具有出色的性能。我們還將使用ActiveJ啟動器模塊。Launcher是對主要方法的高度概括的抽象,主要方法負(fù)責(zé)應(yīng)用程序的生命周期,依賴關(guān)系和日志記錄。
public
final
class
HttpHelloWorldExample
extends
HttpServerLauncher {
@Provides
AsyncServlet servlet() {
return
request -> HttpResponse.ok200().withPlainText(
"Hello World!"
);
}
public
static
void
main(String[] args)
throws
Exception {
Launcher launcher =
new
HttpHelloWorldExample();
launcher.launch(args);
}
}
我們已經(jīng)從Launcher模塊擴(kuò)展了HttpServerLauncher類。
ActiveInject @Provides批注創(chuàng)建一個AsyncServlet。它異步接收來自客戶端的HTTP請求并發(fā)送HTTP響應(yīng)。要啟動服務(wù)器,只需使用Launcher.launch方法即可。轉(zhuǎn)到localhost:8080以檢查您的服務(wù)器。多虧了ActiveInject,您可以輕松擴(kuò)展示例以使其更加復(fù)雜。
您可以在GitHub上找到此示例的源代碼,或在ActiveJ HTTP文檔中找到更多信息。
ActiveCodegen
動態(tài)字節(jié)碼生成器,通過精簡的API封裝了直接字節(jié)碼操作的復(fù)雜性。它使用自動類型推斷,將開銷幾乎為零的類Lisp類AST樹表達(dá)式直接編譯為字節(jié)碼。這是一個實現(xiàn)Example接口的sayHello方法的小示例。
Class<Example> example = ClassBuilder
// DefiningClassLoader represents a loader for defining dynamically generated classes .create(DefiningClassLoader.create(Thread.currentThread().getContextClassLoader()), Example.class)
.withMethod(
"sayHello"
, call(staticField(System.
class
,
"out"
),
"println"
, value(
"Hello world"
)))
.build();
Example instance = example.getDeclaredConstructor().newInstance();
instance.sayHello();
ActiveSerializer
ActiveSerializer是使用ActiveCodegen實現(xiàn)的,并引入了無模式的方法來實現(xiàn)序列化過程的最佳性能。它具有對Java子類,集合(包括帶有循環(huán)引用的圖形以及HPPC等專用集合)的全面支持。而且,它支持插件,擴(kuò)展,版本控制,可以使用Java注釋等進(jìn)行微調(diào)。根據(jù)ActiveSerializer網(wǎng)站上的基準(zhǔn)測試,它是世界上最快的基于JVM的序列化器。這是一個用例的小例子:
public
static
class
Person {
public
Person(
@Deserialize
(
"age"
)
int
age,
@Deserialize
(
"name"
) String name) {
this
.age = age;
this
.name = name;
}
@Serialize
(order =
0
)
public
int
age;
@Serialize
(order =
1
)
public
final
String name;
}
您可以在GitHub或ActiveSerializer docs中找到更多示例。ActiveSerializer可以獨立于框架使用,也可以作為獨立庫使用。
ActiveSpecializer
通過在運(yùn)行時重寫字節(jié)碼來自動加速代碼的獨特技術(shù)。與傳統(tǒng)的編譯器優(yōu)化工具不同,它使用類實例的運(yùn)行時信息:所有類字段都轉(zhuǎn)換為靜態(tài)類字段,所有虛擬方法調(diào)用都被虛擬化并替換為靜態(tài)方法調(diào)用。根據(jù)基準(zhǔn)測試,在某些情況下,ActiveSpecializer可使您的代碼速度提高7倍。
例如,讓我們看看如何使用ActiveSpecializer優(yōu)化典型的AST表達(dá)式樹f(x)=((x + 5)– 5)*(-1)。該表達(dá)式將如下所示:
static
IntUnaryOperator INT_UNARY_OPERATOR =
new
IntUnaryOperatorProduct(
new
IntUnaryOperatorSum(
new
IntUnaryOperatorSum(
new
IntUnaryOperatorIdentity(),
new
IntUnaryOperatorConst(
5
)),
new
IntUnaryOperatorConst(-
5
)),
new
IntUnaryOperatorConst(-
1
));
//And it is equivalent to this manually optimized equation:
static
IntUnaryOperator INT_UNARY_OPERATOR_OPTIMIZED_MANUALLY =
new
IntUnaryOperator() {
@Override
public
int
applyAsInt(
int
x) {
return
-x;
}
};
讓我們看看ActiveSpecializer將如何自動處理第一個表達(dá)式:
static
IntUnaryOperator INT_UNARY_OPERATOR_OPTIMIZED_AUTOMATICALLY =
SPECIALIZER.specialize(INT_UNARY_OPERATOR);
根據(jù)基準(zhǔn),原始方程式的運(yùn)算時間為69.938 ns,而手動和自動專用方程式的運(yùn)算時間分別僅為26.533 ns和26.691 ns。
但是,ActiveSpecializer遠(yuǎn)遠(yuǎn)超出了算術(shù)方程式。您可以在GitHub或ActiveSpecializer docs中找到ActiveSpecializer示例??梢元毩⒂诳蚣苁褂盟鳛楠毩?。
ActiveRPC
閃電般的二進(jìn)制協(xié)議,用于開發(fā)分布式應(yīng)用程序和微服務(wù)解決方案。為了最大程度地減少開銷,ActiveRPC不使用HTTP和JSON或XML編碼。相反,它由快如閃電的ActiveSerializer驅(qū)動,在TCP上運(yùn)行,并具有自定義的高性能二進(jìn)制流協(xié)議。
ActiveRPC具有高度優(yōu)化的服務(wù)器和客戶端實現(xiàn)以及預(yù)定義的云策略,這些策略有助于管理服務(wù)器之間或服務(wù)器分片之間的請求安排。這些策略包括first available,round-robin,集合點哈希等。您可以組合這些策略。例如,讓我們使用第一個可用的和循環(huán)戰(zhàn)略管理的4個連接池:
RpcStrategy strategy = roundRobin(
firstAvailable(servers(ADDRESS_1, ADDRESS_2)),
firstAvailable(servers(ADDRESS_3, ADDRESS_4)));
您可以更改連接數(shù)量,應(yīng)用不同的策略,并且您的應(yīng)用程序?qū)⒛軌蛟幚砀哓?fù)載方案:
RpcStrategy strategy = rendezvousHashing(hashFunction)
.withShard(
1
, firstAvailable(servers(ADDRESS_1, ADDRESS_2)))
.withShard(
2
, firstAvailable(servers(ADDRESS_3, ADDRESS_4)))
.withShard(
3
, server(ADDRESS_5));
您可以在GitHub或ActiveRPC docs中找到ActiveRPC示例。
還請參見:Java(和您)的類型安全單元表達(dá)式
ActiveFS
通過上載,下載,追加,列出,復(fù)制,移動,刪除以及其他用于本地,遠(yuǎn)程或分布式存儲的方法,提供微小的異步抽象。它具有類似于FTP的簡單協(xié)議以及零開銷流傳輸,并支持?jǐn)?shù)據(jù)冗余,重新平衡和重新分片。
private
RemoteFsClusterClient client;
...
Eventloop eventloop = Eventloop.create();
Map<Object, FsClient> clients = ...;
client = RemoteFsClusterClient.create(eventloop, clients)
.withReplicationCount(N /
2
)
.withServerSelector(RENDEZVOUS_HASH_SHARDER);
專業(yè)數(shù)據(jù)庫
ActiveJ具有一系列專用數(shù)據(jù)庫實現(xiàn),例如操作轉(zhuǎn)換數(shù)據(jù)庫,CRDT服務(wù)器數(shù)據(jù)庫和OLAP數(shù)據(jù)庫。
實用程序
包括應(yīng)用程序引導(dǎo),生命周期和管理組件,如啟動器,服務(wù)圖,JMX和觸發(fā)器。
結(jié)論
ActiveJ是一個全新的開發(fā)平臺,可通過輕量級且可本地伸縮的異步體系結(jié)構(gòu)創(chuàng)建各種復(fù)雜程度的現(xiàn)代應(yīng)用程序,從而從硬件中擠出最后的性能。
您可以在GitHub存儲庫上瀏覽ActiveJ源代碼。可以在官方網(wǎng)站上找到有關(guān)ActiveJ的文檔和示例。