activemq-叢集和主從模式 學習筆記
activemq主從模式與叢集
三種masterslave模式
主從方式 | 要求 | 效能 |
---|---|---|
共享檔案系統 | 要求SAN網路共享儲存 | |
JDBC主從方式 | 共享資料庫 | 速度不如日誌快 |
複製的LevelDB | zookeeper伺服器 | 速度快 |
共享檔案系統配置
多個broker爭奪共享檔案鎖,取得檔案鎖的成為master
<persistenceAdapter>
<kahaDB directory="/sharedFileSystem/sharedBrokerData"/>
</persistenceAdapter >
or
<persistenceAdapter>
<levelDB directory="/sharedFileSystem/sharedBrokerData"/>
</persistenceAdapter>
or
<persistenceAdapter>
<amqPersistenceAdapter directory="/sharedFileSystem/sharedBrokerData"/>
</persistenceAdapter>
<broker xmlns="http://activemq.apache.org/schema/core"
dataDirectory="/some/location"
brokerName="mmuserb2" useJmx="true" advisorySupport="false"
persistent="true" deleteAllMessagesOnStartup="false"
useShutdownHook="false" schedulerSupport="true">
JDBC主從方式
跟共享檔案系統的方式類似,但是更可靠,速度上最慢
<beans>
<!-- Allows us to use system properties as variables in this configuration file -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
<broker xmlns="http://activemq.apache.org/schema/core">
<destinationPolicy>
<policyMap><policyEntries>
<policyEntry topic="FOO.>">
<dispatchPolicy>
<strictOrderDispatchPolicy />
</dispatchPolicy>
<subscriptionRecoveryPolicy>
<lastImageSubscriptionRecoveryPolicy />
</subscriptionRecoveryPolicy>
</policyEntry>
</policyEntries></policyMap>
</destinationPolicy>
<persistenceAdapter>
<jdbcPersistenceAdapter dataDirectory="${activemq.base}/activemq-data"/>
<jdbcPersistenceAdapter dataDirectory="activemq-data" dataSource="#oracle-ds"/>
</persistenceAdapter>
<transportConnectors>
<transportConnector name="default" uri="tcp://localhost:61616"/>
</transportConnectors>
</broker>
<!-- This xbean configuration file supports all the standard spring xml configuration options -->
<!-- Oracle DataSource Sample Setup -->
<bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:AMQDB"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
</beans>
可複製的LevelDB儲存(zooKeeper主從模式推薦模式)
從一系列的broker中取出一個broker作為master,從master的broker同步更新的資料到所有的slave broker。對於N個的broker,同步複製(N/2 + 1)機器後,非同步複製其他slave。
該模式下下面的配置應該是一樣的
<broker brokerName="broker" ... >
...
<persistenceAdapter>
<replicatedLevelDB
directory="activemq-data"
replicas="3"
bind="tcp://0.0.0.0:0"
zkAddress="zoo1.example.org:2181,zoo2.example.org:2181,zoo3.example.org:2181"
zkPassword="password"
zkPath="/activemq/leveldb-stores"
hostname="broker1.example.org"
/>
</persistenceAdapter>
...
</broker>
屬性 | 預設值 | 註釋 |
---|---|---|
replicas | 3 | (replicas/2 + 1)數量避免叢集宕機 |
securityToken | 做複製時候的安全令牌 | |
zkAddress | 127.0.0.1:2181 | 使用逗號分隔一系列zk |
zkPassword | 連線到zk時候的密碼 | |
zkPath | /default | 主從切換時候選舉資訊 |
zkSessionTimeout | 2s | 檢測一個zk節點是否宕機 |
sync | quorum_mem | 使用逗號分隔的一系列值,local_mem,local_disk,remote_mem,remote_disk,quonum_mem,quonum_disk,如果結合多種同樣的話,disk優先取,quorum_mem等價於local_mem,remote_mem,quorum_disk等價於local_disk,remote_disk |
每個節點都需要不同的
屬性 | 預設值 | 註釋 |
---|---|---|
bind | tcp://0.0.0.0:61619 | |
hostname | ||
weight | 1 | 權重 |
標準的LevelDB儲存屬性
屬性 | 預設值 | 註釋 |
---|---|---|
directory | LevelDB | 用於儲存資料檔案,不存在會自動建立 |
readThreads | 10 | read執行緒數量 |
logSize | 104857600(100MB) | 單個數據檔案最大值 |
verifyChecksums | false | 校驗資料檔案 |
paranoidChecks | false | 儲存error儘早丟擲異常 |
indexFactory | org.fusesource.leveldbjni.JniDBFactory, org.iq80.leveldb.impl.Iq80DBFactory | LevelDB索引 |
indexMaxOpenFiles | 1000 | 索引能使用openfile數量 |
indexBlockRestartInterval | 16 | |
indexWriteBufferSize | 6291456(16MB) | 寫入到磁碟前記憶體索引資料大小 |
indexBlockSize | 4096 | |
indexCacheSize | 268435456(256MB) | 用於快取索引快的記憶體 |
indexCompression | snappy | 用於索引塊的壓縮策略,snappy或者none |
logCompression | none | 用於日誌記錄的壓縮策略,snappy或者none |
使用KahaDB作為儲存
5.4版本以後activemq推薦使用kahaDB作為預設的儲存機制
kahadb在activemq的使用
<broker brokerName="broker">
<persistenceAdapter>
<kahaDB directory="activemq-data" journalMaxFileLength="32mb"/>
</persistenceAdapter>
</broker>
KahaDB 的屬性
屬性 | 預設值 | 註釋 |
---|---|---|
archiveCorruptedIndex | false | true為歸檔毀壞的索引(不刪除) |
archiveDataLogs | false | true表示把訊息資料檔案移動到歸檔目錄(不刪除) |
checkForCorruptJournalFiles | false | true表示在啟動的時候檢查毀壞檔案並嘗試恢復 |
checkpointInterval | 5000 | 單位毫秒 |
checksumJournalFiles | true | |
cleanupInterval | 30000 | 單位毫秒 |
compactAcksAfterNoGC | 10 | 設定過大會影響效能, |
compactAcksIgnoresStoreGrowth | false | |
concurrentStoreAndDispatchQueues | true | |
concurrentStoreAndDispatchTopics | false | 推薦設定為false |
directory | activemq-data | 資料和日誌檔案目錄 |
directoryArchive | null | 消費後訊息歸檔位置 |
enableAckCompaction | true | |
enableIndexWriteAsync | false | true表示非同步更新索引 |
enableJournalDiskSyncs | true | 廢,請看journalDiskSyncStrategy |
ignoreMissingJournalfiles | false | true表示忽略遺失的日誌檔案 |
indexCacheSize | 10000 | 在記憶體中快取的索引頁數量 |
indexDirectory | 不設定使用directory目錄 | |
indexWriteBatchSize | 1000 | 批量寫入的索引數量 |
journalDiskSyncInterval | 1000 | 單位毫秒,同步磁碟時間間隔 |
journalDiskSyncStrategy | always | always :periodic :never : |
journalMaxFileLength | 32mb | |
maxAsyncJobs | 10000 | 佇列儲存最大的非同步訊息,應該與MessageProducer的數量一樣 |
preallocationScope | entire_journal_async | 預分配檔案 |
preallocationStrategy | sparse_file | 如何預先分配檔案,sparse_file,設定檔案長度,os_kernel_copy,委託給作業系統,zeros不設定檔案長度 |
storeOpenWireVersion | 11 | 5.9.0預設為6 |
networkConnector模式
網路模式
用於提供高可用,容災的分散式佇列和話題,客戶端能夠快速從宕機的broker切換到另外正常運作的broker。
networkConnector的配置
- 硬編碼所有的networkConnector的元素(該模式也支援其他的傳輸協議,比如http)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://activemq.org/config/1.0">
<broker brokerName="receiver" persistent="false" useJmx="false">
<networkConnectors>
<networkConnector uri="static:(tcp://localhost:62001)"/>
</networkConnectors>
<persistenceAdapter>
<memoryPersistenceAdapter/>
</persistenceAdapter>
<transportConnectors>
<transportConnector uri="tcp://localhost:62002"/>
</transportConnectors>
</broker>
</beans>
- 使用自動發現檢測broker(multicast or rendezvous)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://activemq.org/config/1.0">
<broker name="sender" persistent="false" useJmx="false">
<networkConnectors>
<networkConnector uri="multicast://default"/>
</networkConnectors>
<persistenceAdapter>
<memoryPersistenceAdapter/>
</persistenceAdapter>
<transportConnectors>
<transportConnector uri="tcp://localhost:0" discoveryUri="multicast://default"/>
</transportConnectors>
</broker>
</beans>
network Connector的配置形式如下
multicast://address:port?transportOptions
選項名稱 | 預設值 | 描述 |
---|---|---|
group | default | 起一個唯一名字避免多播阻塞 |
minmumWireFormatVersion | 0 | 最小允許的wireFomat版本 |
trace | false | 記錄傳輸的所有命令 |
useLocalHost | true | true表示本地機器命名為localhost |
datagramSize | 4 * 1024 | UDP包的大小 |
timeToLive | -1 | 資料包生存時間,設定大於1可以傳送到其他的broker中 |
loopBackMode | false | 迴路模式是否使用 |
wireFormat | default | 使用的WireFormat名字 |
wireFormat.* | 用於配置wireFormat |
使用預設值配置等價於multicast://239.255.2.3:6155
multicast://default
multicast://224.1.2.3:6255?group=mygroupnam
OpenWire####
配置broker訊息代理的資訊
需要加上字首wireFormat.
屬性名 | 預設值 | 描述 |
---|---|---|
cacheEnabled | true | |
cacheSize | 1024 | 當使用快取時候,快取的數量 |
maxInactivityDuration | 30000 | 認為socket已經掛死的間隔時間然後主動殺死connection,為0表示不啟用 |
maxInactivityDurationInitalDelay | 10000 | 檢查時延 |
maxFrameSize | MAX_LONG | 允許的幀大小,配置以避免oom |
prefixPacketSize | true | |
stackTraceEnabled | ture | |
tcpNoDelayEnabled | true | |
tightEncodingEnabled | true |
使用靜態發現
<networkConnectors>
<networkConnector uri="static:(tcp://host1:61616,tcp://host2:61616,tcp://..)"/>
</networkConnectors>
靜態發現的屬性
屬性 | 預設值 | 描述 |
---|---|---|
initialReconnectDelay | initialReconnectDelay | 單位毫秒,useExponentialBackOff為false情況下,第一次嘗試重連的時間間隔 |
maxReconnectDelay | 30000 | 單位毫秒,重連間隔時間 |
useExponentialBackOff | true | 每次重連失敗都會增加重連時間間隔 |
backOffMultiplier | 2 | useExponentialBackOff每次增加時間 |
uri="static:(tcp://host1:61616,tcp://host2:61616)?maxReconnectDelay=5000&useExponentialBackOff=false"
MasterSlave discovery
建立網路橋接模式到一個broker以及她的slave中,使用masterslave來進行操作
<networkConnectors>
<networkConnector uri="masterslave:(tcp://host1:61616,tcp://host2:61616,tcp://..)"/>
</networkConnectors>
URI的順序是
The URIs are listed in order for: MASTER,SLAVE1,SLAVE2…SLAVE(thumbs down)
NetworkConnector元素的屬性
屬性 | 預設值 | 描述 |
---|---|---|
name | bridge | network的名稱,兩個相同broker之間的不同networkConnector使用不同的名字 |
dynamicOnly | false | true表示僅當進行持久訂閱的時候network才啟用,預設在啟動時候就啟用 |
decreaseNetworkConsumerPriority | false | true表示消費者啟動時候優先順序為-5,經過一個跳的network連線消費者就減少1,false表示所有的消費者使用與本地消費者同樣的優先順序0 |
networkTTL | 1 | 訊息和持久訂閱能夠穿越的broker數量 both message&consumer |
messageTTL | 1 | 訊息能穿越的broker數量 |
consumerTTL | 1 | 消費者能夠穿越的broker數量 |
conduitSubscriptions | true | 多個消費者消費訊息被當作一個消費者 |
excludedDestinations | empty | 在這個名單中的佇列將不會在網路橋接模式在傳遞 |
dynamicallyIncludedDestinations | empty | 可以在網路橋接模式的broker傳播,empty表示不在excludedDestinations中的佇列都可以傳播 |
useVirtualDestSubs | false | true表示監聽虛擬佇列的公告訊息 |
staticallyIncludedDestinations | empty | 會在網路橋接中傳播,即便沒有消費者剛興趣 |
duplex | false | 是否全雙工作模式,true同時用於生產和消費訊息 |
prefetchSize | 1000 | 每次預取的數量 |
suppressDuplicateQueueSubscriptions | false | true表示網路橋接中兩個broker複製訊息將會被制止,比如,A,B,C三個broker使用multicast discovery,A上的消費者a會在產生B和C的broker上,此外,C上消費者也會連線到B,B消費者也會連線到C;為true的時候,BC之間的網路橋接將被禁止,因為她們已經訂閱了Abroker上面的訊息了,減少路由選擇,用這種方法能夠確定消除訊息在死路由(卡住訊息)網路中遷移的可能,networkTTL大於等於broker的數量時候需要這個屬性進行調停。 |
bridgeTempDestinations | true | |
alwaysSyncSend | false | true表示不持久化的訊息使用請求應答的模式,這個配置對持久和非持久的選擇都一樣 |
staticBridge | false | true表示broker不會動態響應新的消費者,將會使用staticallyIncludedDestinations建立新的需求訂閱。 |
userName | null | 遠端broker的使用者名稱 |
password | null | 密碼 |
可靠性
如果源broker是持久訂閱或者持久佇列,network會保持持久化
如果源broker是非持久化的,發生異常會導致線上訊息丟失
訊息時序
無法保證訊息時序,存在消費者從一個broker遷移到另外一個broker的情況。
管道訂閱(Conduit subscription)
activemq使用活躍的消費者在network中傳遞訊息。broker複製了一份遠端broker的訂閱,然後路由傳送給本地的客戶端連線。如果是話題或者是超過一個的訂閱,多個副本將會訊息產生。導管就是為了預防副本訊息在整個network中氾濫傳播,這個預設執行情況,使得多個訂閱在遠端的broker上行為就如同單個訂閱一樣。
然而,複製的訂閱是一個有用的特性如果我們僅僅使用佇列模式開發,這樣子負載均衡演算法就能把訊息均勻的分配,如果conduitSubscriptions=false的話,在network上的消費者將會均分訊息。比如AB兩個broker,B上有2個訊息者,A只有1個消費者,A生產了30個訊息,在conduitSubscriptions=true的情況下,15個傳送到A消費者,15個傳送到B的borker上,如果conduitSubscriptions=false,10個傳送到A,10個傳送到B1,10個傳送到B2。
Duplex network connectors
broker1配置到broker2的netwokrConnector是單向,如果設定duplex=true的話就是雙向的了,
同時可以配置在同一個broker中配置多個networkConnector增加吞吐量
<networkConnectors>
<networkConnector name="SYSTEM1" duplex="true" uri="static:(tcp://10.x.x.x:61616)">
<dynamicallyIncludedDestinations>
<topic physicalName="outgoing.System1" />
</dynamicallyIncludedDestinations>
</networkConnector>
<networkConnector name="SYSTEM2" duplex="true" uri="static:(tcp://10.x.x.x:61616)">
<dynamicallyIncludedDestinations>
<topic physicalName="outgoing.System2"/>
</dynamicallyIncludedDestinations>
</networkConnector>
</networkConnectors>
Conduit subscriptions and consumer selectors
導管訂閱忽略了在本地broker的消費者的selector並把訊息傳送給遠端的消費者。遠端的broker的selector在訊息分發之前被解析,這在多broker中會存在問題。可以想象訊息被A產生被傳送到B或者C等broker,但是訊息並不能滿足B,C等broker等selector的特徵,為了避免這種情況,要開啟conduitSubscription這個屬性。
networkConnector的配置陷阱
advisorySupport如果沒有開啟的話networkConnector可能會不正常的工作。
networkConnector嚴重依賴於advisory messages,消費者連線到遠端的broker的話,會接收到所有關於advisory Message,在大規模情況下工作效果不會工作的很好。
只把特定佇列的訊息傳送到遠端broker。
<networkConnector uri="static:(tcp://host)">
<dynamicallyIncludedDestinations>
<queue physicalName="include.test.foo"/>
<topic physicalName="include.test.bar"/>
</dynamicallyIncludedDestinations>
</networkConnector>
在activemq的5.6版本或者更久遠的需要增加字首ActiveMQ.Advisory.Consumer.,配置demo如下
<networkConnector uri="static:(tcp://host)" destinationFilter="Queue.include.test.foo,ActiveMQ.Advisory.Consumer.Topic.include.test.bar">
<dynamicallyIncludedDestinations>
<queue physicalName="include.test.foo"/>
<topic physicalName="include.test.bar"/>
</dynamicallyIncludedDestinations>
</networkConnector>
Pure static networks
用於儲存broker不受遠端broker的消費者的影響,或者把當前broker當做一個用於傳送訊息的代理,可以考慮配置成static network
<networkConnector uri="static:(tcp://host)" staticBridge="true">
<staticallyIncludedDestinations>
<queue physicalName="always.include.queue"/>
</staticallyIncludedDestinations>
</networkConnector>
staticBridge 引數在5.6版本以後使用,表示本地的broker不會從遠端的broker訂閱任何有關advisoryMessage,staticallyIncludedDestinations表示該佇列或者是話題可以傳播到遠端的broker去,在5.6之前的版本不存在staticBridge的屬性,我們可以destinationFilter 去監聽沒用到的advisory話題,類似下面的配置
<networkConnector uri="static:(tcp://host)" destinationFilter="NO_DESTINATION">
<staticallyIncludedDestinations>
<queue physicalName="always.include.queue"/>
</staticallyIncludedDestinations>
</networkConnector>
如果像上述配置的話,broker將會嘗試監聽在ActiveMQ.Advisory.Consumer.NO_DESTINATION的新的消費者,並且不受遠端broker的消費者影響。
Dynamic networks and Virtual Destinations
這裡存在兩個broker,LocalBroker配置的network如下
<networkConnector uri="static:(tcp://host)">
<dynamicallyIncludedDestinations>
<topic physicalName="include.bar"/>
</dynamicallyIncludedDestinations>
</networkConnector>
remote Broker配置了組合話題如下
<compositeTopic name="include.bar" forwardOnly="false">
<forwardTo>
<queue physicalName="include.bar.forward" />
</forwardTo>
</compositeTopic >
假設在remote Broker的include.bar.forward佇列的存在一個消費者。往include.bar話題傳送了一個訊息的話,實際上將會被傳送到
include.bar.forward佇列並被消費掉。如果是往localBroker釋出一個相同的話題,這個訊息將不會傳送到remoteBroker去。
訊息之所以不會被傳送是因為在include.bar.forward的消費者不能檢測到localBroker的dynamicallyIncludedDestinations 列表,因為沒有在原始佇列(話題)include.bar的消費者,訊息不會被傳送到RemoteBroker。這裡我們通過配置LocalBroker來監聽虛擬目的地訂閱來解決。
首先,當消費者的訂閱符合虛擬目的地,我們需要配置remoteBroker傳送advisoryMessage,在這個例子中,我們配置remoteBroker的useVirtualDestSubs 為true
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://activemq.org/config/1.0">
<broker name="remoteBroker" useVirtualDestSubs="true">
.....
</broker>
</beans>
同時,配置localBroker監聽advisoryMessage設定useVirtualDestSubs 為true
<networkConnector uri="static:(tcp://host)" useVirtualDestSubs="true">
<dynamicallyIncludedDestinations>
<topic physicalName="include.bar"/>
</dynamicallyIncludedDestinations>
</networkConnector>
配置後在remoteBroker的佇列include.bar.forward的消費者可以獲取到從LocalBroker傳送過來的include.bar的話題。
Virtual Destination Consumers on Destination Creation
讓我們重新考慮上面的組合情況,如果沒有消費者在remoteBroker的佇列上,
remoteBroker的組合佇列配置如下
<compositeTopic name="include.bar" forwardOnly="false">
<forwardTo>
<queue physicalName="include.bar.forward" />
</forwardTo>
</compositeTopic >
組隊話題配置在remoteBroker上,然後localBroker使用network連線到這個上面,即便我們開啟了useVirtualDestSubs屬性,訊息也不會發送到沒有消費者的remoteBroker上,這樣子訊息只會擠壓在LocalBroker上,需要
設定remoteBroker的屬性useVirtualDestSubsOnCreation=true,訊息會發送到remoteBroker上,同時remoteBroker必須是
1到多個佇列,擁有持久化的話題
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://activemq.org/config/1.0">
<broker name="remoteBroker" useVirtualDestSubs="true" useVirtualDestSubsOnCreation="true">
.....
</broker>
</beans>
Composite Destination consumers and Virtual Topics
LocalBroker
<networkConnector uri="static:(tcp://host)">
<dynamicallyIncludedDestinations>
<topic physicalName="VirtualTopic.>"/>
</dynamicallyIncludedDestinations>
</networkConnector>
RemoteBroker
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://activemq.org/config/1.0">
<broker name="remoteBroker" useVirtualDestSubs="true" >
.....
</broker>
</beans>
卡住的訊息(Stuck Messages)
預設情況,訊息是不允許回溯會他來自的broker,這樣子就可以避免訊息的傳遞成為一個環。偶然的情況下,存在需要訊息重新回溯到原有佇列。比如在這種情景,有兩個broker,其中一個broker宕機後,消費者路由到另外一個broker中,然後宕機的broker被重啟,但是沒有消費者在宕機的broker上進行消費,所以宕機的broker重啟後上擠壓的訊息沒被消費掉,一個解決的方法是配置rebalanceClusterClients=true屬性,另一種解決方法是允許訊息回溯回他原來的broker。配置conditionalNetworkBridgeFilterFactory 標籤的屬性replayWhenNoConsumers=true。
如果是activemq版本小於5.9,需要關閉遊標複製檢測,enableAudit=false。conditionalNetworkBridgeFilterFactory 還可以調節消費速率限制。
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue="TEST.>" enableAudit="false">
<networkBridgeFilterFactory>
<conditionalNetworkBridgeFilterFactory replayWhenNoConsumers="true"/>
</networkBridgeFilterFactory>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
相關推薦
activemq-叢集和主從模式 學習筆記
activemq主從模式與叢集 三種masterslave模式 主從方式 要求 效能 共享檔案系統 要求SAN網路共享儲存 JDBC主從方式 共享資料庫 速度不如日誌快 複製的LevelD
FTP主動模式和被動模式學習筆記
關於FTP,有被動模式和主動模式兩種,有人說是驗證模式,我不太認同,但懶得查資料,不想咬文嚼字,糾結這種事情。下面簡單從自己理解的角度來記錄一下兩種模式的學習筆記。 1、被動模式 程式碼流程: 客戶端:發PASV\r\n命令到21埠 伺服器:通過21埠向客戶端發資料通道埠(
設計模式學習筆記(二)--簡單工廠模式和工廠模式
bsp bubuko rac oid nds gen body () pri 老生長談的兩個設計模式了,這裏把這兩個設計模式對比著來總結一下。 什麽是簡單工廠模式? 簡單工廠模式:根據傳入工廠類的參數動態決定要創建哪一個產品類的實例。 UML圖如下(以實現一個計算器為例):
redis單機版和叢集版特性(學習筆記1)
關係型資料庫&nosql 1、複雜的查詢 在傳統的關係型資料庫中查詢一個複雜的業務需要寫很複雜的 sql 語句。 2、伸縮性 在傳統的關係型資料庫業務增大系統需要擴容只能是縱向的形式擴充套件.操作效能也與遇到瓶頸 3、傳統資料庫遵循 ACID 規則。而 Nosql 一般為分散式而分散式一
設計模式學習筆記--工廠(Factory)、建造(Builder)和原型(Prototype)
寫在模式學習之前 什麼是設計模式:在我們進行程式設計時,逐漸形成了一些典型問題和問題的解決方案,這就是軟體模式;每一個模式描述了一個在我們程式設計中經常發生的問題,以及該問題的解決方案;當我們碰到模式所描述的問題,就可以直接用相應的解決方法去解決這個問題,
java設計模式學習筆記--原型模式(淺克隆和深克隆)
1. 什麼是原型模式 原型模式屬於物件的建立模式。。原型模式允許你通過複製現有的例項來建立新的例項。 這個模式的重點在於,客戶端的程式碼在不知道要例項化何種特定類的情況下,可以製造出新的例項。在java中,一般使用clone()的方法,或者序列化。 2
ActiveMQ(七)_偽叢集和主從高可用使用
一、本文目的 介紹如何在同一臺虛擬機器上搭建高可用的Activemq服務,叢集數量包含3個Activemq,當Activemq可用數>=2時,整個叢集可用。 本文Activemq的叢集數量為3個,分別命名為mq1,mq2,mq3 二、概念介紹 1、偽叢集
設計模式學習筆記-適配器模式(對象適配器)
ring ons col class pat ima pub 不兼容 public 一、概述 將一個類的接口轉換為客戶希望的另外一個接口。Adapter模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作; 二、模式中的角色 Target:定
設計模式學習筆記-橋接模式
學習 write images 基礎 abs 分離 對象 bsp uml 一、概述 將抽象部分與它的實現部分分離,使它們都可以獨立地變化。 二、模式中的角色 Abstraction:定義抽象類的接口;維護一個指向Implementor類型對象的指針;
簡單工廠模式 - 學習筆記
我想 ase 幫助 rto .class 分支 value sqlserve catch 工廠模式主要是為創建對象提供過渡接口,以便將創建對象的具體過程屏蔽隔離起來,達到提高靈活性的目的。 工廠模式可以分為三類: 簡單工廠模式(Simple Factory) 工廠方法模
設計模式學習筆記(二) 設計基本原則之【單一職責原則】
code 分享 開發者 實際應用 需要 ret ext file類 tor 單一職責原則(SRP: Single Responsibility Principle) 名詞解釋: 1) 職責:是指類變化的原因。 2) 職責擴散:就是因為某種原因,職責P被分化為粒度更細的職責P
Java 設計模式學習筆記1——策略模式(Duck例子)
利用 實例化 top 而是 實現 學習筆記 left ng- 多個 0、假設現有工程(Duck)中遇到為類添加功能的問題,如何設計類添加新的功能? 1、利用繼承提供的Duck(鴨子)的行為會導致哪些缺點? (1)代碼在多個子類中重復 (2)很多男知道所有鴨子的全部行為
設計模式學習筆記
開發 新的 check cal n) prot family 書寫 末尾 一、JS靈活性 1、在團隊開發中,為了減少方法覆蓋或者被覆蓋,我們可以用一個變量來保存這些方法和屬性; 示例: var checkObject = { checkName = function()
C#.Net 設計模式學習筆記之創建型 (一)
應用 種類 單件 src nag abstract 子類 指定 相關 1、抽象工廠(Abstract Factory)模式 常規的對象創建方法: //創建一個Road對象 Road road =new Road(); new 的問題: 實現依賴,不能應對“具
網頁排版中的浮動和定位(學習筆記)
mage hidden alt images blog clear ul li -a www CSS中的浮動和定位 在了解CSS中的浮動和定位之前有必要先了解清楚標準流和脫離標準流的特性 雖然浮動和定位很重要,但是在以後的網頁寫作中,還是盡量少用,最好別亂用,不然後
Java設計模式學習筆記,三:建造者模式
() stat sys pri builder 統一 return tengine str 建造者模式:實現了構建和裝配的解耦,即對象的各個子組件單獨構建,再進行裝配,從而建造完整對象。 該模式適用於構建較為復雜的對象(多個子組件)。 不同的構建者,使用相同的裝配者,可以建
NetApp DataONTAP 集群模式 學習筆記2
netapp dataontap 集群模式WAFL工作原理基本結構如下圖:客戶端發送寫請求控制器1將數據寫到系統內存和NVRAM中,並將數據同步到控制2上控制器2發送確認給控制器1控制器1發送確認給客戶端另一個客記端發送寫請求控制器1將數據寫入系統內存和NVRAM中,並同步給控制器2控制器2發送確認給控制器1
NetApp DataONTAP 集群模式 學習筆記3
netapp dataontap 集群模式DATA SVMData SVM是安全多租戶的基本單元,它能將集群分區,以程現為多個不相關的SVM。每個SVM對客戶端程現為單個獨立的服務器。除非集群管理員開啟,否則在集群中流量不會SVM之間傳輸。如果不啟用多租戶,仍然需要至少一個DataSVM。SVM之前被稱之為v
設計模式學習筆記 C#代碼(一)
內容 編程 繼承 color 模式 c# 派生類 ive spa 《深入淺出設計模式》學習筆記第一章 原始需求和設計 事情是這樣開始的,公司需要做一套程序,鴨子,設計如下: 一個鴨子父類,多個派生類,三個可override的方法。 第一次需求變更 我們要會飛的鴨子!!!!
設計模式學習筆記-原型模式
都是 tde 淺復制 posit osi 訪問 oid urn public 1. 概述 通過復制一個已經存在的實例來創建一個新的實例。被復制的實例被稱為原型,這個原型是可定制的。 2. 模式中的角色 2.1 抽象原型類(Abstract Prototype)